我有一个名为saveToLocalStorage的BehaviorSubject变量,在一个方法中,next()方法被调用两次。这造成了一个问题,因为这两个中只有一个完成了。另一个被简单地覆盖了。对调用执行subscribed的服务将数据保存到本地存储,其他任何内容都不保存。显然,两次调用之间必须有一个延迟,所以我决定这样处理Observable中的调用(假设if语句返回true):
Observable.of(1).pipe(
tap(()=> {if(this.currentWebAppMode !== newMode){
this.saveToLocalStorage.next([DataType.STORED_RESULTS, null])};
}),
debounceTime(100))
.subscribe(result => this.saveToLocalStorage.next([DataType.WEB_APP_MODE, newMode])); 这是可行的,但感觉真的很麻烦。因此,我想知道是否有更合适的方法来确保后续对saveToLocalStorage的两个next()调用都能够正确执行。
编辑:多亏了黛博拉,我能够通过合并concatMap操作符而不是tab和debounceTime来改进我的解决方案。下面是我的新代码:
Observable.of(1).pipe(
concatMap(()=> {if(this.dataStoreService.currentAppMode !== newMode){
this.saveToLocalStorage.next([DataType.STORED_RESULTS, null])};
return of(true)}))
.subscribe(result => this.saveToLocalStorage.next([DataType.WEB_APP_MODE, newMode]));发布于 2019-11-18 14:13:58
使用concatMap将确保以串行方式处理每个源值。
下面的代码首先创建一个发送值的"action“流(我只发送1和2,但您明白了)。
在发出每个项时,代码将执行所需的管道。
在管道中,代码使用concatMap来确保每个发出的项都得到了完全处理。如果一个项在第一个项的处理完成之前发出,则第二个项将在内部缓存,并在第一个发出的项的处理完成后立即进行处理。
在本例中,代码调用doSave来实际执行保存到本地存储过程...如果保存成功,则返回true。
如下所示:
saveSubject = new BehaviorSubject<number>(1);
saveAction$ = this.saveSubject.asObservable();
source = this.saveAction$.pipe(
concatMap(value =>
this.doSave(value)
)
);
ngOnInit() {
this.source.subscribe();
this.saveSubject.next(2);
}
doSave(value) {
console.log('Emited value:', value);
// Save to local storage
return of(true);
}我这里有一个stackblitz:https://stackblitz.com/edit/angular-concatmap-deborahk
https://stackoverflow.com/questions/58904754
复制相似问题