首页 > 解决方案 > RxJS 队列调度器

问题描述

我的要求是每 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 在完成上一个请求后调用retrieveData ......但是所有请求同时登陆到retrieveData 中。

我的输出是:

开始在队列中添加项目

完成在队列中添加项目

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

开始在队列中添加项目

完成在队列中添加项目

开始(3次)

完成(3次)

完成(3次)

你能告诉我是什么问题吗?

标签: angularrxjsrxjs6

解决方案


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

它只是将您赋予它的任务推迟到 JavaScript 事件队列。您不能使用async / await.

您可能想要的是concat操作员。你给它一个一个接一个订阅的 observables 列表。这意味着,一旦第一个 observable 完成,第二个 observable 就会被订阅。

基本上,创建一个你的 observables 列表,然后像这样连接它们:

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

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


推荐阅读