jeerjmin
@jeerjmin

Как последовательно вызвать промисы с минимальной задержкой?

Нужно вызвать промисы из массива последовательно с минимальной задержкой между вызовами в 3 секунды, чтобы 'r1` выводился через 1сек, потом `r2` через 4сек, потом `r3` через 3сек.

Сейчас r1 и r2 выводятся как нужно, а r3 сразу за r2. Проблема с установкой минимальной задержки для r3. Прошу помочь. Мой код ниже.

class Y {
        constructor() {
            this.promises = new Array();
        }

        push(promise) {

            this.promises.push(_ => promise)

        }

    }

    async function runPromisesInSequence(promises) {

        for (let promise of promises) {

            console.log(await promise());
        }
    }

    const pr1 = new Promise(res => setTimeout(() => res('r1'), 1000));
    const pr2 = new Promise(res => setTimeout(() => res('r2'), 5000));
    const pr3 = new Promise(res => setTimeout(() => res('r3'), 0));

    let y = new Y();
    y.push(pr1);
    y.push(pr2);
    y.push(pr3);


    runPromisesInSequence(x.promises)
  • Вопрос задан
  • 530 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
async function delayedPromise(cb) {
  const delay = () => new Promise(resolve => setTimeout(resolve, 3000));
  const result = await Promise.all([cb(), delay()]);
  return result[0];
}
async function runPromisesInSequence(promises) {
  for (let promise of promises) {
    console.log(await delayedPromise(promise), new Date());
  }
}
const pr1 = () => new Promise(res => setTimeout(() => res('r1'), 1000));
const pr2 = () => new Promise(res => setTimeout(() => res('r2'), 5000));
const pr3 = () => new Promise(res => setTimeout(() => res('r3'), 0));
const y = [pr1, pr2, pr3];
runPromisesInSequence(y);


И еще, обратите внимание, когда вы пишете
const pr1 = new Promise(res => setTimeout(() => res('r1'), 1000));

Ваш setTimeout стартует в этот же момент. Т.е. вы их все три одновременно запускаете
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Попытался разобраться с Promise и async/await. Примерно понял, благодаря вашему вопросу, документации и ответу Антон

Чтобы для самого первого элемента не добавлялась задержка, сделал доп. условие:
const delay = _ => new Promise(rs => setTimeout(rs, 3e3));

async function notSoFast(promise) {
  result = await Promise.all([ promise, delay()]);
  return result[0];
}

async function runPromisesInSequence(promises) {
  for (let i=0; i<promises.length; i++) {
    if(i === 0) {
      console.timeEnd( await promises[0]);
    } else {
      console.timeEnd( await notSoFast(promises[i]));
    }
  }
}

function makePr(label, dur) {
  return new Promise(rs => {
    console.log('%s started', label);
    console.time(label); // начало отсчёта
    setTimeout(_ => {
      console.log('%s timer completed', label);
      rs(label);
    }, dur);
  });
}

runPromisesInSequence([
  makePr('r1', 1000),
  makePr('r2', 5000),
  makePr('r3', 0000),
]);
/* Выводит:
r1 started
r2 started
r3 started
r3 timer completed
r1 timer completed
r1: 1005ms
r2 timer completed
r2: 5007ms
r3: 8009ms
*/


Fiddle
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы