Изучаю промисы. Подскажите, пожалуйста, как выполнить такую задачу:
Вывод даты через секунду после начала выполнения, потом через 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());
}
Чтобы попасть во второй 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);
});
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости