1

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

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();
4

1 回答 1

1

toPromise()在完成时在 Observable 上执行。由于您的 observable 从未真正完成,因此它不会执行。用于take(1)强制它在 observable 完成之前发出值。

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 是否完成,只要发出至少一个值就会完成。所以这真的取决于下次toPromise()调用observable 时发出的值

于 2018-05-12T06:16:31.990 回答