问答 百科手机端

RxJS Observable中的循环在调用complete或error后不会停止

2023-04-07 10:18
调用Observer.complete()或observer.error()时,即使在调用observer.complete()之后,也可以在observer.next(Count);console.log(“test”)、observer.complete()之后简单地使用return语句。Create函数应该返回teardown函数(TeardownLogic)。
提问开始:

当调用observer.complete()observer.error()时,观察者停止发送数据,并被视为已完成。但是,如果观察器中存在for循环,则即使在调用observer.complete()之后,该循环也将继续运行。有人能给我解释一下这种行为吗?我预计循环会被缩短。当前行为意味着,除非我在代码中取消订阅,否则interval或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")}
  )
回答开始:得票数 1

正确销毁资源是create函数的职责。在您的例子中,在observer.complete()之后可以简单地使用return语句。

但通常情况下,如果需要,create函数应返回teardown函数(TeardownLogic),该函数在observable完成时调用。

new Observable( observer => {
  // observable logic, e.g. ajax request
  return () => {
    // teardown function, e.g. cancel ajax request
  };
});

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();
总结

以上是真正的电脑专家为你收集整理的RxJS Observable中的循环在调用complete或error后不会停止的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。

热门