.then
s выполняется асинхронно (аналогично setTimeout(.., 0)
) (даже если обещание разрешается немедленно), тогда как функция создания обещания в new Promise((res, rej) => {
выполняется синхронно. Таким образом, если вы создаете группу обещаний синхронно , например, с forEach
до окончания основного потока, все блоки обещаний будут выполняться немедленно до любого из then
s достигнуты.
Используйте await
и либо reduce
, либо for..of
, чтобы гарантировать, что итерации запускаются в последовательном , а не в параллельном:
var arr = [1, 2, 3, 4];
var promises = [];
arr.reduce(async function(lastPromise, elem) {
await lastPromise;
return print(elem)
.then(addAndPrint)
}, Promise.resolve())
function print(elem) {
return new Promise(function(resolve, reject) {
console.log(elem);
resolve(elem);
});
}
function addAndPrint(elem) {
console.log(elem + 100);
}