javascript - RxJS 自定义运算符不调用完成
问题描述
我有以下自定义运算符:
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();
我错过了什么?
解决方案
好问题,现在让我们深入解释一下。
首先,让我们看看解决方案
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
操作符内部以及subscribe
) 之后,source
不会发出任何其他内容,因为它已经完成。
您可以查看源代码 => take(),如果有一些模糊的部分,请随时询问更多信息。
推荐阅读
- vba - Excel不会重新计算公式,直到它被迫
- applescript - 拆分字符串并获取 AppleScript 中的第一个元素
- python - 单击具有 href = '#' 的锚标记
- gnuplot - 如何在脚本中删除标签和箭头到下一个图
- angular - Angular 6 Share 模块不起作用
- xpath - SoapUI Xpath 断言:匹配字段的确切长度
- javascript - 如果在元素内找到特定值,则使用 jquery 隐藏元素
- vue.js - 将“数据”部分中的变量声明为 $root 的别名不是响应式的
- android - 迁移到 AndroidX 后出现“转换失败”错误
- c# - 将 LinkButton 添加到 gridview 小计行