javascript, цепочка промисов для setTimeout

190
25 марта 2018, 22:45

Изучаю промисы. Подскажите, пожалуйста, как выполнить такую задачу: Вывод даты через секунду после начала выполнения, потом через 2, потом через 6, и т.д.
После первого вывода даты перевожу промис в статус fullfilled , далее правильно дата выводиться через 2 сек, но потом следующая дата выводиться через 4 сек (а должна через 6 сек.), т.е следующий промис не дожидается выполнения предыдущего (в смысле выполнения logDate метода). Как заставить его ждать ? Делаю так:

let promise = new Promise((resolve, reject) => { 
  setTimeout(() => { 
    logDate(); 
    resolve(); 
  }, 1000); 
}); 
 
promise 
  .then(() => { 
    setTimeout(() => { 
      logDate(); 
    }, 2000); 
 
  }) 
  .then(() => { 
    setTimeout(() => { 
      logDate(); 
    }, 6000); 
  }); 
 
function logDate() { 
  console.log(new Date()); 
}

Answer 1

Чтобы попасть во второй then после выполнения таймаута надо в первом возвращать промис, и резолвить его по окончанию таймера:

let promise = new Promise((resolve, reject) => { 
  setTimeout(() => { 
    logDate(); 
    resolve(); 
  }, 1000); 
}); 
 
promise 
  .then(() => { 
    return new Promise((resolve, reject) => { 
      setTimeout(() => { 
        logDate(); 
        resolve(); 
      }, 2000); 
    }); 
  }) 
  .then(() => { 
    setTimeout(() => { 
      logDate(); 
    }, 6000); 
  }); 
 
function logDate() { 
  console.log(new Date()); 
}

Еще пример сокращения и читабельности вашего кода:

logDate() 
  .then(() => logDate(2000)) 
  .then(() => logDate(6000)); 
 
function logDate(delay = 1000) { 
  return new Promise((resolve, reject) => { 
    setTimeout(() => { 
      console.log(new Date()); 
      resolve(); 
    }, delay); 
  }); 
}

READ ALSO
Как сделать такой же CANVAS?

Как сделать такой же CANVAS?

Добрый день, есть CANCAS на этом сайте, как сделать такой же эффект космоса, либо можно ли изъять его с этого сайта?

179
PHP. Удалить id из двух таблиц за один запрос?

PHP. Удалить id из двух таблиц за один запрос?

Как удалить две записи (id) за один запрос? Пример:

216
Вывести массивом курс валют (API)

Вывести массивом курс валют (API)

Доброго времени суток, есть скрипт который подключается средством API к банку и выводит курс валют, скрипт выводит только одну валюту USD, как...

192
SQL LIKE %?% странно выбирает данные из БД

SQL LIKE %?% странно выбирает данные из БД

В $_GET['key'] из формы передается строка символов введенных с клавиатурыВ БД нужно найти все записи, в которых встречается такая подстрока

190