我正在尝试使用离子包装将补全添加到cordova插件中。因此,我将在订户中了解完成情况。所以我得到了一点Sererive,它是科尔多瓦普劳金的离子包装纸:
startListen(){
return this.someService.startListen().pipe(
switchMap((response) => {
return new Observable(subscriber => {
if (response.index !== undefined) {
subscriber.next(1);
}
if (response.errorTitle === Message.NOT_FOUND) {
subscriber.error(Message.NOT_FOUND);
}
if (response.errorTitle === Message.CANCELLED) {
console.log('blah blah'); <---### IS PRINTED
subscriber.complete();
}
});
}),
);
}
我在某些组件中称呼它:
startListen(){
this.someFacade.startListen().subscribe(
(x) => console.log('next', x),
(x) => console.log('error', x),
() => console.log('complete'), <---# NOT PRINNTED
);
console.log('complete')永远不会触发的问题。
怎么了?
发现了问题。我也需要关闭第一个可观察的对象。所以我的解决方案:
const completed = new Subject();
return this.someService.startListen().pipe(
switchMap((response) => {
return new Observable(subscriber => {
if (response.index !== undefined) {
subscriber.next(response.index);
}
if (response.errorTitle === Message.NOT_FOUND) {
subscriber.next(Message.NOT_FOUND);
}
if (response.errorTitle === Message.CANCELLED) {
subscriber.complete();
completed.next();
completed.unsubscribe();
}
});
}),
takeUntil(completed)
);
takeWhile
运算符会执行您想要的操作:
this.someService.startListen().pipe(
takeWhile(response => response.errorTitle !== Message.CANCELLED),
switchMap(response => response.index !== undefined
? of(response.index)
: throwError(response.errorTitle)
)