RxJS Observable,直到条件成立为止

时间:2017-02-15 12:20:12

标签: javascript rxjs observable rxjs5

这里的传统的基于承诺的代码片段按预期工作,并在满足条件(存在全局变量)时导致完成的observable:

const fooPromise = new Promise(resolve => {
  const interval = setInterval(() => {
    if (window.foo) {
      clearInterval(interval);
      resolve(window.foo);
    }
  }, 100);
});

setTimeout(() => {
    window.foo = {};
}, 1000)

const foo$ = Rx.Observable.fromPromise(fooPromise);

foo$.subscribe(
    () => console.log('success'),
    () => console.log('error'),
    () => console.log('complete')
);

我试图将其转换为更整洁的可观察解决方案,fiddle

'use strict';

setTimeout(() => {
    window.foo = {};
}, 1000)

const foo$ = Rx.Observable.interval(100).map(() => foo).retry(-1)

foo$.subscribe(
    () => console.log('success'),
    () => console.log('error'),
    () => console.log('complete')
);

看起来我正走在正确的轨道上,但是观察结果并没有完成,并且继续发送垃圾邮件。

解决此问题的适当方法是什么?

1 个答案:

答案 0 :(得分:1)

您只需要一个foo,因此请使用take(count) operator

  

仅发出源Observable发出的第一个计数值。

     

从源获取第一个计数值,然后完成。

const foo$ = Rx.Observable.interval(100).map(() => foo).retry().take(1)

Fiddle