[英]Loops in RxJS Observable don't stop after calling complete or error
當調用observer.complete()
或observer.error()
,觀察者停止發送數據並被視為完成。 但是,如果觀察者中有 for 循環,即使在調用了observer.complete()
之后,循環也會繼續運行。 有人可以向我解釋這種行為嗎? 我希望循環會被縮短。 當前行為意味着除非我在代碼中取消訂閱,否則間隔或 while 循環將永遠在Observable
運行。
在下面的代碼段中,我添加了一個console.log
以查看是否會在observer.complete()
之后調用日志。
const testObservable = new Observable( observer => {
for (let count = 0; count < 11; count++){
observer.next(count);
if (count > 5) {
observer.complete()
console.log("test")
}
if (count > 7) {
observer.error(Error("This is an error"))
}
}}
);
let firstObservable = testObservable.subscribe(
next => {console.log(next)},
error => { alert(error.message)},
() => {console.log("complete")}
)
正確銷毀資源是 create 函數的責任。 在您的情況下,在observer.complete()
之后可能有簡單的return
語句。
但一般來說,如果需要,創建函數應該返回拆卸函數 (TeardownLogic),當 observable 完成時調用該函數。
new Observable( observer => {
// observable logic, e.g. ajax request
return () => {
// teardown function, e.g. cancel ajax request
};
});
一旦 observable 完成,Observable 只會忽略next(...)
、 complete()
和error(...)
未來調用。 這意味着complete()
或error(...)
函數在內部被調用,或者 observable 被外部取消訂閱。
new Observable( observer => {
observer.next('a');
observer.complete();
// next calls will be ignored
observer.next('b');
});
const observable = new Observable( observer => {
setTimeout(
() => observer.next('a'), // this will be ignored due to unsubscribe
10
);
});
const subscription = observable.subscribe(...);
subscription.unsubscribe();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.