RxJS Observable 轮询直到条件为真

RxJS Observable that polls until the condition is true

这是遗留的基于 promise 的代码片段,它按预期工作并在满足条件(存在全局变量)时导致完成可观察:

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')
);

看起来我的方向是正确的,但可观察对象尚未完成并继续使用值发送垃圾邮件。

解决这个问题的合适方法是什么?

你只需要取一个foo,所以使用take(count) operator :

Emits only the first count values emitted by the source Observable.

Takes the first count values from the source, then completes.

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

Fiddle