【问题标题】:RxJS Queue SchedulerRxJS 队列调度器
【发布时间】:2020-01-26 15:06:35
【问题描述】:

我的要求是每 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次)

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

【问题讨论】:

    标签: angular rxjs rxjs6


    【解决方案1】:

    队列调度器不会等待你放入任务的结果。

    它只是将您赋予它的任务推迟到 JavaScript 事件队列。您不能使用async / await 使其顺序完成异步任务。

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

    基本上,创建一个可观察对象列表,然后像这样连接它们:

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

    这会依次下载三个资源。

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多