Всякий раз, когда вы видите, что Promise.all () используется, он обычно используется с двумя циклами, как я могу превратить его в один без использования async и , поддерживающих порядок выполнения ?
Вопрос не о порядке, я знаю, что promise.all сохраняет порядок, вопрос о том, как избежать двух циклов, когда вам просто нужно возвращаемое значение
function timeout(x){
return new Promise( resolve => {
setTimeout( () => {
return resolve(x);
},x)
})
}
const promises = [];
const results = [];
//First loop, array creation
for (i = 0; i < 20; i++) {
const promise = timeout(i*100)
promises.push(promise);
}
Promise.all(promises).then( resolvedP => {
//Second loop, async result handling
resolvedP.forEach( (timeout,i) => {
results.push({
index : i,
timeout : timeout
})
})
console.log(results);
})
//End of code
Теперь этоможно решить с помощью async
, но в моем контексте я не могу использовать его, например:
//Only one loop
for (i = 0; i < 20; i++) {
const timeoutAwait = await timeout(i*100);
results.push({
index : i,
timeout : timeoutAwait
})
}
console.log(results)
//End of code
Я попробовал следующее, но обещание не возвращает значение resolve
без использования .then()
:
for (i = 0; i < 20; i++) {
const promise = timeout(i*100)
promises.push(promise);
results.push({index : i, timeout : promise});
}
Promise.all(promises).then( resolvedP => {
resolvedP.forEach( (timeout,i) => {
results.push({
index : i,
timeout : timeout
})
})
console.log(results);
//results[0].timeout is a Promise object instead of 0
})
//End of code
Итак, есть ли способ сделать мой первый пример кода только в одном цикле?Пожалуйста, игнорируйте контекст, это только пример.