RxJS Observable中的循环在调用complete或error后不会停止
调用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后不会停止的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。
你可能想看: