我有以下自定义运算符:
export function test() {
return function(source) {
return new Observable(observer => {
return source.subscribe({
next(value) {
observer.next(value);
},
error(error) {
observer.error(error);
},
complete() {
console.log('completed')
observer.complete();
}
})
});
}
}
问题是,当我订阅一个完成的可观察对象时,我没有到达完整的回调,即看不到完整的日志。
interval(1000).pipe(
test(),
take(2)
).subscribe();
我想念什么?
答案 0 :(得分:1)
很好的问题,现在让我们深入探讨。
首先,让我们看看解决方案
function test(limitter) {
return function(source) {
return new Observable(observer => {
return source.subscribe({
next(value) {
observer.next(value);
},
error(error) {
observer.error(error);
},
complete() {
console.log("completed action");
observer.complete("completed value");
}
});
});
};
}
interval(1000)
.pipe(
take(2),
test()
)
.subscribe(
x => {
console.log("result: ", x);
},
err => {
console.log(err);
},
end => {
console.log("Observable has been completed");
}
);
因此,在此摘要中,take
运算符位于自定义test()
运算符之前,这意味着每当我们达到所需的计数(在我们的情况下为2
)时, take
运算符将返回完整源,这将触发后续订阅者内部的完整方法(在我们的示例中,在自定义test
运算符内部以及{{1}内部})之后,subscribe
将不会发出任何其他内容,因为它已经完成。
您可以查看源=> take(),有关更多信息,请随时询问是否存在一些模糊的部分。