我一直在阅读Observables
。我读到的一件事是它像流一样聆听的能力。我使用以下代码尝试了此操作。
const Rx = require('rxjs/Rx');
Promise = require('bluebird');
let i = 0;
function calculate() {
return new Promise((resolve, reject) => {
setInterval(() => {
console.log(++i);
resolve(i);
}, 5000);
})
}
let source = Rx.Observable.fromPromise(calculate());
source.subscribe(
next => {
console.log(next, ' next ');
},
err => {
console.error(err)
},
() => {
console.log('done!');
}
)
但这并不像流一样。所以输出看起来像:
1
1 ' next '
done!
2
3
我如何继续遵守诺言?这是可观察的问题真正解决了吗?
最佳答案
Observable.fromPromise
被认为将Promise转换为Observable。由于承诺只能解决一次,因此此流将始终仅输出1个项目。
您不能通过在其上包装流来增强Promise功能。如果promise只能产生1个值,那么在所得的可观察值中只会产生1个值。
在您的特定示例中,有一个Observable.interval(n)
每隔n
毫秒发出1个项目。否则,为了获得更自定义的观察结果:
Rx.Observable.create(obs => {
let i=0;
setInterval(() => {
obs.next(++i);
}, 1000);
});
创建可观察对象时,您将获得一个
Observer
实例,该实例代表刚刚订阅您的流的观察者。注意,每个新的观察者将创建一个新的上下文(因此,在我的示例中,每个观察者将具有其i
计数器)。