Обещания, к сожалению, не позволяют контролировать их поток.Это означает -> как только вы создадите новое Обещание, оно будет выполнять свои асинхронные части так, как им нравится.
Promise.all
не меняет его, его единственная цель состоит в том, чтобы он проверял все обещания, которые вы вставили в негои он разрешается, когда все они завершены (или один из них не работает).
Чтобы иметь возможность создавать и контролировать асинхронный поток, самый простой способ - заключить создание Promise в функцию и создать какой-то видзаводского метода.Тогда вместо того, чтобы создавать все обещания заранее, вы просто создаете только одно обещание, когда вам это нужно, подождите, пока оно не будет решено, и после этого продолжите в том же поведении.
async function doAllSequentually(fnPromiseArr) {
for (let i=0; i < fnPromiseArr.length; i++) {
const val = await fnPromiseArr[i]();
console.log(val);
}
}
function createFnPromise(val) {
return () => new Promise(resolve => resolve(val));
}
const arr = [];
for (let j=0; j < 10; j++) {
arr.push(createFnPromise(Math.random()));
}
doAllSequentually(arr).then(() => console.log('finished'));
PS: Это также возможно без асинхронного / ожидающего использования стандартных цепочек обещаний, но его необходимо реализовать с помощью рекурсии.