首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止behaviorsubject next()调用相互覆盖?

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

Stack Overflow用户
提问于 2019-11-18 04:11:47
回答 1查看 874关注 0票数 0

我有一个名为saveToLocalStorageBehaviorSubject变量,在一个方法中,next()方法被调用两次。这造成了一个问题,因为这两个中只有一个完成了。另一个被简单地覆盖了。对调用执行subscribed的服务将数据保存到本地存储,其他任何内容都不保存。显然,两次调用之间必须有一个延迟,所以我决定这样处理Observable中的调用(假设if语句返回true):

代码语言:javascript
复制
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操作符而不是tabdebounceTime来改进我的解决方案。下面是我的新代码:

代码语言:javascript
复制
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]));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-18 14:13:58

使用concatMap将确保以串行方式处理每个源值。

下面的代码首先创建一个发送值的"action“流(我只发送1和2,但您明白了)。

在发出每个项时,代码将执行所需的管道。

在管道中,代码使用concatMap来确保每个发出的项都得到了完全处理。如果一个项在第一个项的处理完成之前发出,则第二个项将在内部缓存,并在第一个发出的项的处理完成后立即进行处理。

在本例中,代码调用doSave来实际执行保存到本地存储过程...如果保存成功,则返回true。

如下所示:

代码语言:javascript
复制
  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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58904754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档