如何防止behaviorsubject next()调用相互覆盖?

时间:2019-11-17 20:11:46

标签: angular typescript rxjs observable behaviorsubject

我有一个名为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运算符而不是concatMaptab来改善我的解决方案,这是我的新代码:

debounceTime

1 个答案:

答案 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