我正在尝试将Angular函数转换为可观察模式,因为它的当前实现具有一些异步性。出于本讨论的目的,请使用这个简单的示例。
aFunction(x: boolean){
if(x){
// ... do something asynchronous based on the value of x
}
}
将其转换为使用Observable可以这种方式完成:
anObservableFunction(x: boolean): Observable<any> {
const result = new Subject();
if(x){
// ... do something asynchronous based on the value of x
// ... where once the actual value you want to return to
// the subscribing functions, you can pass in the
// result.next(value);
// result.complete();
}
return result.asObservable();
}
我面临的问题(根据我的理解)是为了不访问内部选择语句的实例。
anObservableFunction(x: boolean): Observable<any> {
const result = new Subject();
if(x){
// ... do something asynchronous based on the value of x
// ... where once the actual value you want to return to
// the subscribing functions, you can pass in the
// result.next(value);
// result.complete();
} else {
// here
}
return result.asObservable();
}
如果使用常规主题,订阅功能肯定不会获得任何值,因为事件的顺序是:
如果使用BehaviorSubject或ReplaySubject,它们的初始/构造值将被保留,导致订阅事件不必要地触发?
答案 0 :(得分:0)
如果值是同步发出的,那么使用Subject会有问题。 BehaviorSubject具有不必要的初始值的缺点,但是ReplaySubject实际上没有那个并且可以工作,但是如果有人稍后订阅了你可能不想要的东西,它也会重放这个值。
一个简单的技巧是通过勾号延迟同步发射:
setTimeout(() => result$.next(42), 0);
但是,您也可以直接返回一个observable并避免使用主题:
foo(x) {
if(x) {
return callRemoteEndpoint();
}
return of(42);
}