在subject.next之后是否有任何陷阱返回subject.asObservable()?

时间:2019-06-07 16:41:29

标签: angular rxjs observable

假设我有以下代码

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()更新的值?上面的代码有什么陷阱吗?

2 个答案:

答案 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()