Rx JS Планировщик очереди - PullRequest
0 голосов
/ 26 января 2020

Мое требование - каждые 10 секунд, нужно выбирать данные из Back-end и обновлять свойства для списка ввода. Кроме того, запрос должен поразить серверную часть один за другим. Я искал в net и обнаружил, что планировщик очереди будет полезен для этого. (Дайте мне знать, если мое понимание неверно). Поэтому я создал следующий код:

  1. Начальный интервал для каждых 10 секунд
      private initializeInterval() {
        interval(10000).subscribe(x => {
          this.queueItems();
        });
      }
Создание планировщика очереди:
  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");
  }
Извлечение данных из бэкэнда
  private async retrieveData(item) {
    console.log("Starting");
    let result = await this.rest.downloadPrope(item);
    console.log(result)
    console.log("Completed");
  }

Я ожидаю, что QueueScheduler вызовет retrieveData после завершения предыдущего запроса ... Но все запросы одновременно попадают в retrieveData.

Мой вывод is:

Началось добавление элемента в очередь

Завершено добавление элемента в очередь

Начало (3 раза) (Перед выполнением, следующий запрос был получен из очередь)

Началось добавление элемента в очередь

Завершено добавление элемента в очередь

Запуск (3 раза)

завершено ( 3 раза)

выполнено (3 раза)

Подскажите, пожалуйста, в чем проблема?

1 Ответ

1 голос
/ 26 января 2020

Планировщик очереди не будет ждать результатов поставленных вами задач.

Он просто откладывает выполнение заданных вами задач в очереди событий JavaScript. Вы не можете сделать так, чтобы он последовательно выполнял асинхронные задачи, используя async / await.

. Возможно, вам нужен оператор concat. Вы даете ему список наблюдаемых, которые подписываются на один за другим . Это означает, что, как только первая наблюдаемая будет завершена, вторая наблюдаемая будет подписана.

По сути, создайте список ваших наблюдаемых и затем объедините их следующим образом:

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

Это будет загружать три ресурса один за другим.

...