RxJS Observable 中的循环在调用完成或错误后不会停止
Loops in RxJS Observable don't stop after calling complete or error
当调用 observer.complete()
或 observer.error()
时,观察者停止发送数据并被视为完成。但是,如果在观察者中有一个 for 循环,即使在调用 observer.complete()
之后,循环也会继续 运行ning。有人可以向我解释这种行为吗?我希望循环会被缩短。当前的行为意味着间隔或 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")}
)
创建函数有责任正确销毁资源。在您的情况下, observer.complete()
.
之后可能只有 return
语句
但一般来说,如果需要,创建函数应该 return 拆解函数 (TeardownLogic),在可观察对象完成时调用。
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();
当调用 observer.complete()
或 observer.error()
时,观察者停止发送数据并被视为完成。但是,如果在观察者中有一个 for 循环,即使在调用 observer.complete()
之后,循环也会继续 运行ning。有人可以向我解释这种行为吗?我希望循环会被缩短。当前的行为意味着间隔或 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")}
)
创建函数有责任正确销毁资源。在您的情况下, observer.complete()
.
return
语句
但一般来说,如果需要,创建函数应该 return 拆解函数 (TeardownLogic),在可观察对象完成时调用。
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();