Задержка HTTP-запросов с операторами RxJS - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть Наблюдаемая myObservable, которая получает некоторые предметы с разными интервалами времени.Например, интервал времени между первым и вторым элементом может составлять 1 секунду, а для второго и третьего элемента - 3 секунды.Для каждого элемента отправляется HTTP-запрос методом this.sendMessage().

Проблема в том, что интервал времени между запросами должен составлять не менее двух секунд.Задержка всех запросов на две секунды - не лучшее решение.Например, для первого запроса я не хочу задержки.Я тоже не хочу задержки, когда разница во времени между двумя испускаемыми элементами превышает две секунды.

Это рабочее решение, которое делает то, что я хочу.Но мне интересно, есть ли более rxjs-подобное решение?Я играю с delay() и delayWhen(), но я не нашел способа заставить это работать.У кого-нибудь есть решение?

let lastSendTimestamp = null;

myObservable.pipe(
  concatMap(async body => {

    // Calculate delay time
    let delayTime = 0;
    if (!lastSendTimestamp) {
      delayTime = 0;
    } else if (Date.now() - lastSendTimestamp > 2000) {
      delayTime = 0;
    } else {
      delayTime = 2000 - (Date.now() - lastSendTimestamp);
    }

    // Wait until delay is over
    await new Promise(resolve => setTimeout(resolve, delayTime));

    lastSendTimestamp = Date.now();

    return await this.sendMessage(body);
  }),
).subscribe(result => {
});

1 Ответ

0 голосов
/ 26 ноября 2018

Вместо этого вы можете использовать timer и выполнить цепочку с асинхронным запросом.Там нет необходимости обещать

let lastSendTimestamp = null;

myObservable.pipe(
  concatMap(body => {

    // Calculate delay time
    let delayTime = 0;
    if (!lastSendTimestamp) {
      delayTime = 0;
    } else if (Date.now() - lastSendTimestamp > 2000) {
      delayTime = 0;
    } else {
      delayTime = 2000 - (Date.now() - lastSendTimestamp);
    }
    lastSendTimestamp = Date.now();
    return timer(delayTime).pipe(concatMap(res=>this.sendMessage(body)));
  }),
).
...