具有异步功能和toPromise的Observable RxJS的意外行为是什么?

时间:2018-05-12 06:01:33

标签: rxjs rxjs6

当我只使用订阅方法时,它很有效,但是使用这段代码 - 我不明白结果。

const Observable = require("rxjs").Observable;
let i = 0;
const x = new Observable((o) => {
    setInterval(() => o.next(++i), 1000);
});

(async () => {
    while (true) {
        try {
            console.log("loop");
            console.log("value", await x.toPromise());
        } catch (e) {
            console.log(e);
        }
    }
})();
x.subscribe((value) => {
    console.log("subscribe", value);
});

此代码结果为:

loop
subscribe 2
subscribe 4
subscribe 6
subscribe 8
subscribe 10
subscribe 12
subscribe 14

发生了什么事?

它与使用toPromise

的此变体相同
function a() {
    x.toPromise().then((value) => {
        console.log("promise", value);
        a();
    }).catch((e) => {
        console.log("error", value);
    });
}
a();

1 个答案:

答案 0 :(得分:1)

declare var akarata:any; 在Observable完成时执行。由于您的observable实际上从未完成,因此它不会执行。在完成observable之前,使用take(1)强制它发出值。

toPromise()

输出:

const Observable = require("rxjs").Observable;
let i = 0;
const x = new Observable((o) => {
    setInterval(() => o.next(++i), 1000);
});

(async () => {
    while (true) {
        try {
            console.log("loop");
            console.log("value", await x.take(1).toPromise());//here
        } catch (e) {
            console.log(e);
        }
    }
})();
x.subscribe((value) => {
    console.log("subscribe", value);
});

至于价值观:

无论源可观察源是否完成,

loop subscribe 2 value 1 loop subscribe 4 value 5 loop subscribe 7 value 9 loop subscribe 11 value 14 将完成至少一个值。所以它实际上取决于下次调用take()时observable发出的值