在我们的应用程序中,我们使用了很多地方:
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
至于取消订阅,它在完成时是自动的,所以在完成之前,你不应该取消订阅,在完成时,你解决了诺言并且默默地(由于可观察的默认行为)取消订阅.