【发布时间】: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 => ..)) -
酷,谢谢@friddo。因此,缺乏对验证器和可观察对象如何工作的理解。所以我不明白 BehaviorSubject 在我订阅时才完成,不是吗?
-
不,只有当您调用
subject.complete()时,主题才会完成。
标签: angular rxjs observable behaviorsubject