将可完成的内容添加到从未完成的可观察对象中

问题描述 投票:0回答:2

我正在尝试使用离子包装将补全添加到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')永远不会触发的问题。

怎么了?

cordova rxjs cordova-plugins
2个回答
0
投票

发现了问题。我也需要关闭第一个可观察的对象。所以我的解决方案:

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)
        );

0
投票

takeWhile运算符会执行您想要的操作:

this.someService.startListen().pipe(
  takeWhile(response => response.errorTitle !== Message.CANCELLED),
  switchMap(response => response.index !== undefined
    ? of(response.index)
    : throwError(response.errorTitle)
  )

© www.soinside.com 2019 - 2024. All rights reserved.