假设我有以下代码
Injectable()
export class MyStore {
store = new BehaviorSubject(true);
updateStore(value) {
this.store.next(value);
return this.store.asObservable();
}
selectValue() {
return this.store.asObservable();
}
}
从updateStore返回的observable是否可能没有由next()更新的值?上面的代码有什么陷阱吗?
答案 0 :(得分:2)
从updateStore返回的observable是否可能没有由next()更新的值?
不可能。 BehaviorSubject是同步的,因此在next()
的调用返回之前已设置该值。
https://github.com/ReactiveX/rxjs/blob/master/src/internal/BehaviorSubject.ts#L42
next(value: T): void {
super.next(this._value = value);
}
上面的代码有什么陷阱吗?
从updateStore()
返回可观察对象是没有意义的。该函数的调用者已经知道商店的价值。设置值没有延迟,因此调用者无需等待结果。
其他一切都很好。
答案 1 :(得分:2)
从updateStore返回的observable是否可能没有由next()更新的值?
否,observable始终具有在for /f "skip=2 tokens=2,3 delims=," %%a in ('"wmic diskdrive get Model,Size /format:csv"') do @echo Model %%a Size %%b
中传递的值。话虽如此,每当对返回值next()
进行订阅时,订阅者都会收到在updateStore()
中传递的值。
上面的代码有什么陷阱吗?
您不必每次执行“下一步”都next()
。消费者(即订阅者)只需要订阅MyStore.store,因为“商店”本身就是可观察的。
return this.store.asObservable()