我一直在阅读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计数器)。

10-07 15:58
查看更多