为什么在这种情况下“最终”在 RxJS 中不起作用

Why doesn't `finally` work in this case in RxJS?

本文关键字:RxJS 不起作用 最终 这种情况下 为什么      更新时间:2023-09-26

这不会打印"拖动结束":

mouseDrags.forEach(drag => {
    console.log('drag start');
    drag.finally(_ => console.log('drag end'));
    drag.forEach(doSomething);
});

但这打印了"拖拽结束":

mouseDrags.forEach(drag => {
    console.log('drag start');
    drag.finally(_ => console.log('drag end')).forEach(_=>_);
    drag.forEach(doSomething);
});

为什么 forEach 会有所作为?

这是因为.finally()返回了您需要订阅的另一个可观察量。 默认情况下,Observable 是惰性的,因此在订阅之前它们不会开始发出。

所以你可以做

mouseDrags.forEach(drag => {
    console.log('drag start');
    drag.finally(_ => console.log('drag end')).forEach(doSomething);
});

甚至更好

mouseDrags.flatMap(drag => {
    console.log('drag start');
    return drag.finally(_ => console.log('drag end'))  
}).forEach(doSomething);

drag的类型是什么?如果它是可观察量,则需要订阅它。 finally不订阅,但forEach订阅。您可以通过调用 drag.finally(_ => console.log('x')).subscribe() 来测试它。那也应该打印出来。

forEach 实际上是订阅的别名,因此使用任何一个都可以。