Есть ли ловушка возврата subject.asObservable () сразу после subject.next? - PullRequest
1 голос
/ 07 июня 2019

предположим, у меня есть следующий код

Injectable()
export class MyStore {
    store = new BehaviorSubject(true);
    updateStore(value) {
        this.store.next(value);
        return this.store.asObservable();
    }

    selectValue() {
        return this.store.asObservable();
    }
}

Возможно ли, что наблюдаемая, возвращаемая из updateStore, не имеет значения, обновленного функцией next ()? Есть ли подводный камень в приведенном выше коде?

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Возможно ли, что наблюдаемая, возвращаемая из updateStore, не имеет значения, обновленного функцией next ()?

Нет, наблюдаемое всегда будет иметь значение, которое было передано в next(). Сказав, что всякий раз, когда подписка выполняется на возвращаемом значении updateStore(), подписчик получит значение, которое было передано в next().

Есть ли какая-либо ошибка в приведенном выше коде?

Вам не нужно return this.store.asObservable() каждый раз, когда вы делаете «следующий». Потребитель (то есть, кто подписывается) должен просто подписаться на MyStore.store, так как «store» сам по себе является наблюдаемым.

updateStore(value) {
    this.store.next(value);        
}
2 голосов
/ 07 июня 2019

Возможно ли, что наблюдаемая, возвращаемая из updateStore, не имеет значения, обновленного функцией 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() бессмысленно. Вызывающая функция уже знает значение магазина. Задание значения не задерживается, поэтому вызывающему абоненту не нужно ждать результата.

Все остальное выглядит хорошо.

...