【问题标题】:Rxjs do not firingRxjs 不触发
【发布时间】:2018-01-20 02:30:47
【问题描述】:

我知道这是基本的 rx 内容,但我对何时决定触发有点困惑。采取以下措施:

Observable.of([1,2,3,4,5])
  .combineLatest([6,7,8,9,10])
  .take(1)
  .do(([first, second]) => console.log(first, second))
// ...Logs nothing...

为什么在您订阅之前它什么都不做?在我将订阅调用添加到链的末尾之前,不会触发任何日志:

Observable.of([1,2,3,4,5])
  .combineLatest([6,7,8,9,10])
  .take(1)
  .do(([first, second]) => console.log(first, second))
  .subscribe(() => console.log('Subscribed'));
// Logs: 
// "5, 6" 
// "Subscribed"

另外,如果我理解正确,我不需要取消订阅,因为 take(1) 会为我处理,对吗?

【问题讨论】:

  • Rx 最好的比喻是管道。您已经铺设好管道,subscribe() 打开水龙头。另外,take(1) 在传递一项后会发出完整的通知,这也取消了下游订阅。

标签: rxjs


【解决方案1】:

您的示例会生成一个 cold 可观察对象 - 在您订阅之前不会生成。另一种方法是一个 hot observable,它会在不考虑观察者的情况下生成并在观察者之间共享。见hot and cold observables

您可以通过提供onCompleted 回调(订阅中的第三个参数)来检查您的序列是否终止。像这样:

rx.Observable.from([1,2,3,4,5])
  .combineLatest(rx.Observable.from([6,7,8,9,10]))
  .take(1)
  .do(([first, second]) => console.log(first, second))
  .subscribe(() => console.log('Subscribed'), err=> { console.error(err)}, () => console.log('completed!!'));

【讨论】:

  • 谢谢!热/冷很有帮助。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多