根据该条款,onComplete
和的onError
功能subscribe
是互斥的。
表示onError
或onComplete
事件会在我的网站上触发subscribe
。
我有一个逻辑块,无论收到错误还是成功完成信息准备工作,都需要执行该逻辑块。
我finally
在python中寻找了类似的东西,但是我发现的只是finally
需要附加到我创建的可观察对象上。
但是我只想在订阅时以及流结束后(无论成功还是出错)执行该逻辑。
有任何想法吗?
根据该条款,onComplete
和的onError
功能subscribe
是互斥的。
表示onError
或onComplete
事件会在我的网站上触发subscribe
。
我有一个逻辑块,无论收到错误还是成功完成信息准备工作,都需要执行该逻辑块。
我finally
在python中寻找了类似的东西,但是我发现的只是finally
需要附加到我创建的可观察对象上。
但是我只想在订阅时以及流结束后(无论成功还是出错)执行该逻辑。
有任何想法吗?
Answers:
调用此运算符的当前“可点入”变体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更新
finally
块将在您的代码中排在最后。
我现在在Angular应用程序中使用RxJS 5.5.7,并且finalize
对于我的用例,using 运算符具有怪异的行为,因为它在成功或错误回调之前被触发。
简单的例子:
// 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.');
});
finally()
方法首先被附加,并且订阅强制地强制通过/失败。