【问题标题】:Any difference between returning of(T) and new BehaviorSubject(T)?返回 of(T) 和 new BehaviorSubject(T) 有什么区别?
【发布时间】:2019-10-24 17:16:00
【问题描述】:

我想知道这两个函数之间是否有任何区别:

function testObservable(message: string) : Observable<string>{
    return new BehaviorSubject(message);    
}

function testObservable(message: string) : Observable<string>{
    return of(message); 
}

我在AsyncValidatorFn 中返回new BehaviorSubject(T),如果我返回of(T),我会得到不同的行为

更新 - 验证码

export function createPasswordMatchesWithServerValidator(
  passwordMatchesWithServerService: PasswordMatchesWithServerService
): AsyncValidatorFn {

    const wrongPassword = 'password';

    return (c: FormControl): Observable<ValidationErrors | null> => {

        passwordMatchesWithServerService.check(c.value);

        return passwordMatchesWithServerService.checkIfValidOldPassword$.pipe(
          map(response => {
            let error = {};
            error[wrongPassword] = true;
            switch (response.state) {
              case ResponseState.Success:
                console.log('Validation Success: ', response.content);
                break;

              case ResponseState.Failure:
                console.log('Validation Fail: ', response);
                error = {};
                error[wrongPassword] = true;
                break;

              case ResponseState.Loading:
                console.log('Validation Loading...');
                break;
            }
            return error;
          }
        )
    );
  };
}

如果我回来:

const error = {};
error[wrongPassword] = true;
return of(error);

一切正常

【问题讨论】:

  • 将代码发布到您的 AsyncValidatorFn。您的情况的唯一区别是完成,而行为主体没有。没有看到你的代码是不可能帮助你的。
  • AsyncValidatorFn 返回的 Observables 必须完成。 new BehaviorSubject(message) 未完成。如果 passwordMatchesWithServerService.checkIfValidOldPassword$ 未完成,您可以添加 take(1) 例如passwordMatchesWithServerService.checkIfValidOldPassword$.pipe(take(1), map(r =&gt; ..))
  • 酷,谢谢@friddo。因此,缺乏对验证器和可观察对象如何工作的理解。所以我不明白 BehaviorSubject 在我订阅时才完成,不是吗?
  • 不,只有当您调用 subject.complete() 时,主题才会完成。

标签: angular rxjs observable behaviorsubject


【解决方案1】:

Of 在发出所有值后立即完成,并在订阅后立即发出所有值。

BehaviorSubject 是可观察的,它可以发出值,直到您手动关闭它。您可以在 BehaviourSubject 实例上调用 .next() 以发出新值。每个订阅者都将获得BehaviorSubject 发出的最后一个值以及订阅后的所有其他值。

多次订阅of 将导致发出相同值的相同结果。

【讨论】:

  • 在这两个函数中我返回一个Observable,所以我的问题是结果是否有任何差异。
  • 我已经告诉过你了。在BehaviourSubject 中,您可以根据需要发出任意多长的值
  • 如果我们没有为您提供您正在寻找@Buntupana 的答案,请考虑提供更多信息。你能建立一个堆栈闪电战来展示你需要解决的问题吗?
  • 如前所述,不同之处在于 BehaviorSubject 仍然接受要发出的新值。因此,在您的代码中,唯一的区别是 of() 可观察对象在之后完成,而 BehaviourSubject 则没有。异步验证器确实依赖于完成,因此这可能是您获得不同行为的原因,但除非您共享验证器代码,否则我们无法真正判断。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
相关资源
最近更新 更多