簡體   English   中英

RxJS Observable 中的循環在調用完成或錯誤后不會停止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM