【问题标题】:RxJS Observable that polls until the condition is true轮询直到条件为真的 RxJS Observable
【发布时间】:2017-02-15 12:20:11
【问题描述】:

这是一段基于 Promise 的遗留代码,当条件(全局变量的存在)被满足时,它会按预期工作并导致完成 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')
);

看起来我走在了正确的轨道上,但 observable 尚未完成并继续向值发送垃圾邮件。

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

【问题讨论】:

    标签: javascript rxjs observable rxjs5


    【解决方案1】:

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

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

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

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

    Fiddle

    【讨论】:

    • 谢谢,我一直在考虑如何退订间隔,而它就在我的眼皮底下。
    • 我建议使用filter(() => window.foo) 而不是错误和retry 直到无穷大。这是更好的表现和更好的做法,因为错误是可以预防的(甚至预期
    • 我同意这一点,我会这样做。但没有注意到它是window.foo 而不仅仅是foo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多