Lukas Asked:2022-12-27 05:42:40 +0800 CST2022-12-27 05:42:40 +0800 CST 2022-12-27 05:42:40 +0800 CST 订阅中的 Angular 订阅 772 该组件有一个服务调用,响应后您需要检查内部状态或调用另一个方法或显示模式窗口,然后调用此方法。这导致订阅中的订阅。请告诉我如何删除第二个订阅。条件代码:stackblitz 上的示例代码 angular2 1 个回答 Voted Best Answer Neverm1ndo 2022-12-28T18:55:32+08:002022-12-28T18:55:32+08:00 filter您可以使用和运算符switchMap。 filter检查值source并过滤流 switchMap取消订阅上一个线程并订阅下一个线程。 你应该得到这样的东西: onExampleMethod(): void { this.someService.getData() .pipe( takeUntil(this.destroy), filter(() => { if (this.source === 'aa') { this.create(); return false; } return true; }), switchMap(() => this._openDialog()) ) .subscribe((dialogData: any) => { this.food = dialogData; this.create(); }); } private _openDialog(): Observable<any> { return this.dialog.open(DialogExampleComponent, { width: '250px', }).afterClosed(); } 但是由于你的条件this.source === 'aa'不以任何方式依赖于从接收到的数据someService.getData,所以最好不要订阅,而是立即执行该方法create并完成该方法的执行onExampleMethod onExampleMethod() { if (this.source === 'aa') return this.create(); // условие никак не зависит от потока getData this.someService.getData() .pipe( takeUntil(this.destroy), switchMap(() => this._openDialog()) ) .subscribe((dialogData: any) => { this.food = dialogData; this.create(); }); } private _openDialog(): Observable<any> { return this.dialog.open(DialogExampleComponent, { width: '250px', }).afterClosed(); }
filter
您可以使用和运算符switchMap
。filter
检查值source
并过滤流switchMap
取消订阅上一个线程并订阅下一个线程。你应该得到这样的东西:
但是由于你的条件
this.source === 'aa'
不以任何方式依赖于从接收到的数据someService.getData
,所以最好不要订阅,而是立即执行该方法create
并完成该方法的执行onExampleMethod