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)
这是遗留的基于 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)