Несколько вещей: когда вы создаете свою цепочку обещаний внутри цикла for, это все, что происходит: цепочка создается.Выполнение .then
произойдет как можно раньше в следующем цикле событий.Я попытаюсь проиллюстрировать:
var promiseChain = functionReturningPromise();
for(var i=0;i<3;i++){
promiseChain = promiseChain.then(x=> {
return anotherPromiseFunction(x);
});
}
В зависимости от того, что на самом деле делает functionReturningPromise
, что-то уже могло произойти в этот момент ... или, возможно, нет.Например, мы могли запустить fetch
или, возможно, запустить WebWorker.
Однако, если у нас было setTimeout
вложенное внутри первого Promise, то все, что мы сделали, это поместили обратный вызов setTimeout
в очередь дляследующий цикл цикла событий.Но гарантировано 100%, никакие функции .then
еще не запущены.Это происходит позже, в следующем цикле событий.
Итак, следующий цикл событий приходит, и обещание выполнено.Это означает, что следующий .then
будет запущен.Допустим, это не удается.В этот момент, поскольку мы связали обещания (promiseChain = promiseChain.then
), мы сразу же пропускаем первый .catch
(или .then
со вторым параметром) в цепочке, и все промежуточные .then
полностью пропускаются безказнены.Или, если catch
нет, тогда эта цепочка обещаний выполнена.Нет необходимости в перерыве;это просто то, как работают Обещания.
Так что, если вы просто добавите .catch
в самом конце цепочки, все хорошо.
Об этой вещи "цикла событий": I действительно рекомендую посмотреть Джейк Арчибальд: In The Loop , от JSConf.Asia 2018.
Также о await
... Звучит так, как будто есть некоторая путаница в том, каконо работает.Вы можете использовать только await
внутри и async
функции, поэтому вы никогда не сможете полностью заблокировать выполнение потока с помощью одного await
.Это работает как цепочка .then
s, просто синтаксический сахар.Так что @trincot определенно прав, с этим синтаксисом вы будете намного счастливее.