.first()运算符会影响其他订阅

时间:2017-03-08 19:05:29

标签: javascript rxjs rxjs5

示例代码:

const test1$ = Rx.Observable.interval(1000)
const test2$ = Rx.Observable.interval(1000)

// This subscription need to get every value continuously
const firstSub = test2$
  .do(val => console.log('Service: ', val))
  .subscribe()

// This subscription need to get only first value and stop
const secondSub = Rx.Observable.combineLatest(test1$, test2$)
  .do(val => console.log('Method: ', val))
  .first()
  .subscribe()
  • 首次订阅会在应用启动后立即启动。
  • 第二次订阅由点击事件启动(因此可以运行几次)。

当我使用.first().take(1)运算符时,第一次订阅也会受到影响,并停止获取值。

如何更改该行为仍然可以从第一个订阅中获取值,而只从第二个订阅中获取一个值并停止?

2 个答案:

答案 0 :(得分:2)

当您对undefined使用空(subscribe())时,库中存在一个错误。

这是通过以下方式解决: https://github.com/ReactiveX/rxjs/pull/2238

与此同时,如果您像这样更新代码,事情将按预期工作。

const test1$ = Rx.Observable.interval(1000)
const test2$ = Rx.Observable.interval(1000)

// This subscription need to get every value continuously
const firstSub = test2$
  .do(val => console.log('Service: ', val))
  .subscribe({})

// This subscription need to get only first value and stop
const secondSub = Rx.Observable.combineLatest(test1$, test2$)
  .do(val => console.log('Method: ', val))
  .first()
  .subscribe({})

答案 1 :(得分:0)

使用.subscribe()而不使用任何回调更改.first()运算符行为。

如果我在next方法中传递任何.subscribe()回调,则.first()运算符将正常运行。

例如,在secondSub更改

.subscribe()

.subscribe(test => console.log('Method: ', test))