【问题标题】:Completing a hot observable chain with multiple hot observables用多个 hot observables 完成一个 hot observable 链
【发布时间】:2018-03-12 13:01:43
【问题描述】:

所以当第一个可观察对象触发其完成处理程序时,我需要完成一个热可观察链。

一个例子可能更简单:

const hot1 = new Rx.Subject();
const hot2 = new Rx.Subject();

const example = hot1
  .do(() => console.log('HOT1 emitted'))
  .switchMap(() => hot2.do(() => console.log('HOT2 emitted')));

const subscribe = example.subscribe({
  next: console.log,
  error: console.error,
  complete: () => console.info('CHAIN COMPLETE')
});

hot1.next();
hot2.next('abc');

hot1.complete();

演示:http://jsbin.com/berexexoyu/edit?js,console

当我调用hot1.complete() 时,我需要输出CHAIN COMPLETE

这可以在功能上解决,而不进入必要的领域吗?

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    这可能看起来有点小技巧,但由于您只想通过完成 hot1 来控制链,您可以在 hot1 完成后使用 takeUntil 来完成链,同时忽略其所有值:

    const hot1 = new Subject();
    const hot2 = new Subject();
    
    const example = hot1
      .do(() => console.log('HOT1 emitted'))
      .switchMap(() => hot2.do(() => console.log('HOT2 emitted')))
      .takeUntil(hot1.ignoreElements().concat(Observable.of(1)));
    
    const subscribe = example.subscribe({
      next: console.log,
      error: console.error,
      complete: () => console.info('CHAIN COMPLETE')
    });
    
    hot1.next();
    hot2.next('abc');
    
    hot1.complete();
    

    查看更新后的演示(打开控制台):https://stackblitz.com/edit/rxjs5-rfhpi2?file=index.ts

    诀窍在于使用hot1.ignoreElements().concat(Observable.of(1)),它在hot1 完成后发出一个值,通知takeUntil 并且整个链完成。

    【讨论】:

    • 您可以使用last() 运算符代替ignoreElements().concat(Observable.of(1))
    • 嗯,有点。如果hot1 没有发出任何值,那么last() 将永远不会发出任何值,example 也不会完成。使用.concat(Observable.of(1) 保证它会一直发射。
    • 好吧,就像你说的有点老套,但我可以让它工作。然而,一个快速的问题:假设我们有一个更大的链和更多的级别;将它放在最后会在hot1.complete() 上立即终止整个链吗? (会很好)
    • 是的,因为观察者收到complete 并且“Rx 合同”规定它总是只能收到一个完整的通知。所以这使得链递归地处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多