Цепочка then
является асинхронной в том смысле, что код, следующий за цепочкой обещаний, будет выполнен без ожидания достижения обещания в своем разрешенном состоянии.
function sleep (ms) {
return new Promise(resolve, setTimeout(resolve, ms));
}
// counts to 3 in 3 seconds, thanks to asynchronicity
sleep(3000).then(() => console.log('3'));
sleep(2000).then(() => console.log('2'));
sleep(1000).then(() => console.log('1'));
Метод then
данное обещание предоставляет способ присоединения любой функции, которая должна ожидать своего возвращаемого значения (*).Таким образом, цепочка обещаний представляет собой «синхронную последовательность инструкций», но она асинхронна по отношению к остальной части программы.
function add (i) {
return sleep(1000)
.then(() => { console.log(i+1); return i+1 });
}
// counts to 3 in 3 seconds, thanks to synchronicity along the chain
Promise.resolve(0).then(add).then(add).then(add);
Конечно, введение асинхронности было бы совершенно бесполезным, если бы приходилось иметь дело только с линейнымицепей.Релевантность появляется только при создании параллельных цепочек.Напротив, возьмем этот простой синхронный сценарий оболочки:
// counts *down* in 6 seconds
sleep 3; echo 3;
sleep 2; echo 2;
sleep 1; echo 1;
Обратите внимание, что спящий режим обычно представляет ожидание некоторых различных ресурсов по сети, чтобы получить четкое представление о преимуществах асинхронности.
ВМежду тем асинхронность была бы невозможна, если бы не было удобного способа линеаризации задач, и некоторые куски кода ожидали друг друга.Обещания - это удобный способ для достижения этой цели, между прошлой "пирамидой обратного вызова" и последующими асинхронными ключевыми словами ECMA 2017, см., Например, .
(*) Beстарайтесь всегда возвращать что-то в промежуточные функции, иначе вся остальная часть цепочки может перестать ждать.