angular - 如何在rxjs中实现函数调用的队列?

标签 angular rxjs

我有一个调用保存函数的按钮,该按钮调用服务中的保存函数。

    <button (click)="save()">save</button>
    save() {
     this.someService.save().subscribe(r => {
       console.log({ r });
     });
    }

我希望每次单击按钮时操作(服务中的保存方法)都会插入到队列中。

服务上当前的保存方法完成后,然后从队列中提取下一个方法,并再次调用服务中的保存方法,依此类推,直到队列中没有任何内容。

我尝试了类似的方法,但我不确定为什么它只有效一次..

* 注意:SomeService 中的 save 函数我无法更改。

    save() {
     this.someService.addToQueue(true).subscribe(r => {
       console.log({ r });
     });
    }
@Injectable({
  providedIn: "root"
})
export class SomeService {
  queue = new Subject();

  constructor() {
    this.queue.pipe(concatMap(a => this.save(a)));
  }

  addToQueue(saveAndExit) {
    this.queue.next(saveAndExit);

    return this.queue;
  }

  save(saveAndExit) {
    return Observable.create(obs => {
      setTimeout(() => {
        obs.next({ data: true });
      }, 5000);
    });
  }
}

Demo on stackblitz

最佳答案

这里 concatMap 的问题是它不会订阅下一个内部 Observable,直到上一个内部 Observable 完成。如果您完成它:

  save(saveAndExit) {
    return Observable.create(obs => {
      setTimeout(() => {
        obs.next({ data: true });
        obs.complete()
      }, 5000);
    });
  }

你的问题可以解决,但是由于你无法更改该功能,因此你需要使用 f.ex 手动完成它。 take(1)first():

this.queue.pipe(concatMap(a => this.save(a).pipe(take(1)) ));

关于angular - 如何在rxjs中实现函数调用的队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56198601/

相关文章:

ecmascript-6 - Rxjs:每 X 秒重复一次 Ajax 调用,但等待最后一个调用完成

javascript - RxJS:将对象键映射到可观察值

angular - 标题未在 POST 响应中设置

angular - 在 ng build --prod --localize 时更改 Angular 基 href

angular - DOM 操作属于 Angular 2 的什么地方?

javascript - 为什么使用 Rxjs 发出此更改

javascript - 如何使用 RxJS 将 Promises 序列转换为 Rx.Observable?

javascript - 在 Angular 6 中对可观察到的表进行排序

数据更改时 Angular View 不更新

angular - 目标入口点 "@angular-material-extensions/faq"中的错误缺少依赖项 :