这里的传统的基于承诺的代码片段按预期工作,并在满足条件(存在全局变量)时导致完成的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')
);
看起来我正走在正确的轨道上,但是观察结果并没有完成,并且继续发送垃圾邮件。
解决此问题的适当方法是什么?
答案 0 :(得分:1)
您只需要一个foo
,因此请使用take(count)
operator:
仅发出源Observable发出的第一个计数值。
从源获取第一个计数值,然后完成。
const foo$ = Rx.Observable.interval(100).map(() => foo).retry().take(1)