根据this artcle,onComplete
的{{1}}和onError
功能是相互排斥的。
含义subscribe
或onError
事件将在我的onComplete
中启动
我有一个逻辑块,无论是否收到错误都需要执行,或者我成功完成了大量的信息。
我查找了类似finally
in python的内容,但我找到的只是finally
,需要附加到我创建的可观察对象上。
但是我想在我订阅时,以及在流结束之后,无论是成功还是出错,都要做那个逻辑。
有什么想法吗?
答案 0 :(得分:86)
此运算符的当前“pipable”变体称为finalize()
(自RxJS 6起)。较旧且现已弃用的“补丁”运算符称为finally()
(直到RxJS 5.5)。
我认为finalize()
运算符实际上是正确的。你说:
仅在我订阅时以及在流结束后执行该逻辑
我认为这不是问题。如果您愿意,可以在订阅之前使用source
并使用finalize()
。这样,您就不需要始终使用finalize()
:
let source = new Observable(observer => {
observer.next(1);
observer.error('error message');
observer.next(3);
observer.complete();
}).pipe(
publish(),
);
source.pipe(
finalize(() => console.log('Finally callback')),
).subscribe(
value => console.log('#1 Next:', value),
error => console.log('#1 Error:', error),
() => console.log('#1 Complete')
);
source.subscribe(
value => console.log('#2 Next:', value),
error => console.log('#2 Error:', error),
() => console.log('#2 Complete')
);
source.connect();
打印到控制台:
#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message
2019年1月:更新了RxJS 6
答案 1 :(得分:16)
唯一对我有用的是这个
fetchData()
.subscribe(
(data) => {
//Called when success
},
(error) => {
//Called when error
}
).add(() => {
//Called when operation is complete (both success and error)
});
答案 2 :(得分:12)
我现在在Angular应用程序中使用RxJS 5.5.7,并且对于我的用例,使用finalize
运算符的行为很奇怪,因为它在成功或错误回调之前被触发了。
简单的例子:
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000),
finalize(() => {
// Do some work after complete...
console.log('Finalize method executed before "Data available" (or error thrown)');
})
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
我必须在订阅中使用add
方法来完成我想要的。完成成功或错误回调后,基本上是finally
回调。类似于try..catch..finally
块或Promise.finally
方法。
简单的例子:
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000)
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
.add(() => {
// Do some work after complete...
console.log('At this point the success or error callbacks has been completed.');
});