我有一个名为BehaviorSubject
的{{1}}变量,在一种方法中,该saveToLocalStorage
方法被调用了两次。这是一个问题,因为只有两者之一可以完成。另一个只是被覆盖。调用next()
的服务将数据保存到本地存储。显然,两个下一次调用之间必须有一个延迟,因此我决定像这样处理subscribed
内的调用(假设if语句返回Observable
):
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]));
的后续后续next()
调用都能正常执行。
编辑:感谢Deborah,我能够通过合并saveToLocalStorage
运算符而不是concatMap
和tab
来改善我的解决方案,这是我的新代码:
debounceTime
答案 0 :(得分:0)
使用concatMap
将确保以串行方式处理每个源值。
下面的代码首先创建一个“动作”流,该流发出值(我只是发出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);
}
我在这里有个闪电战:https://stackblitz.com/edit/angular-concatmap-deborahk