javascript – 为什么RxJS函数toPromise不会取消订阅

在我们的应用程序中,我们使用了很多地方:

someObservable.take(1).subscribe(onSuccessHandler, onFailureHandler);

但是对于订阅,您需要担心在某些时候取消订阅,这并不总是直截了当.

我正在考虑简化这个并将其重写为:

someObservable.toPromise().then(onSuccessHandler).catch(onFailureHandler);

但是看看toPromise()(here)的实现,我似乎不明白为什么它不关心取消订阅.

代码中的注释表示不能取消,但是我们如何将它留下来泄漏内存(如果我们确实是这样).

编辑

我想出了一个让我担心的例子:

Observable.timer(10, 10).toPromise().then((v) => console.log("I'm done"));

如果我检索到的观察结果是他们永远不会完成的,那么不仅我的承诺永远不会带有价值,而且我也无法取消订阅这些可观察量(例如超时和我的承诺),因为我无法访问订阅对象.这确实泄漏了内存!

解决方法:

我的猜测是因为承诺只解决了一次(而不是像流一样的序列).请注意,订户始终保留最新值,拒绝失败并在完成时解析为最新值.

要尝试自己,请尝试:

    Observable.timer(300,300).take(4).toPromise().then((v) => console.log('tick: ', v)); // logs "3", the last element
    Observable.from(['a','b','c']).toPromise().then((v) => console.log('tick: ', v)); // logs "c", the last element

至于取消订阅,它在完成时是自动的,所以在完成之前,你不应该取消订阅,在完成时,你解决了诺言并且默默地(由于可观察的默认行为)取消订阅.

上一篇:java常用设计模式(三)观察者模式


下一篇:javascript – RxJS:如何包装和观察字符串的变化?