RxJS队列调度程序

问题描述 投票:0回答:1

我的要求是每10秒,需要从后端获取数据并更新输入列表的属性。同样,请求应一一打到后端。我在网上搜索,发现队列调度程序将对此有用。 (让我知道我的理解是否错误)。所以我创建了以下代码:

  1. 每10秒的启动间隔
      private initializeInterval() {
        interval(10000).subscribe(x => {
          this.queueItems();
        });
      }
  1. 创建队列调度程序:
  private queueItems() {
    let taskEntry: = ['111','2222','333']
    console.log("Started adding item in queue");
    taskEntry.forEach(item => {
      queue.schedule(this.retrieveData.bind(this), 100, item);
    })

    console.log("Completed adding item in queue");
  }
  1. 从后端检索数据
  private async retrieveData(item) {
    console.log("Starting");
    let result = await this.rest.downloadPrope(item);
    console.log(result)
    console.log("Completed");
  }

[我的期望是QueueScheduler在完成上一个请求后调用了RemoveData ...但是所有请求同时落入了retrieveData。

我的输出是:

开始在队列中添加项目

队列中添加项已完成

开始(3次)(在完成之前,下一个请求从队列中到达)

开始在队列中添加项目

队列中添加项已完成

开始(3次)

已完成(3次)

已完成(3次)

您能告诉我这是什么问题吗?

angular rxjs rxjs6
1个回答
0
投票

队列调度程序将不会等待您放入的任务的结果。

它只是将您分配给JavaScript事件队列的任务推迟。您无法使用async / await使它依次完成异步任务。

您可能想要的是concat运算符。您为它提供了已订阅一个接一个]的可观察对象的列表。这意味着,第一个可观察对象完成后,第二个可观察对象将被订阅。

基本上,创建您的可观测对象的列表,然后像这样连接它们:

concat(['111','2222','333'].map(item => this.rest.downloadPrope(item)))

这将一个接一个地下载这三个资源。

© www.soinside.com 2019 - 2024. All rights reserved.