我有一个数组,如果某些条件成立,每个元素将通过2个嵌套的异步任务。否则,将完成1个正常同步任务,并在完成所有操作后返回带有新更新的数组。
以下是我的代码的简化版本:
someFunction(array) {
array.forEach((element, index) => {
if (some checks hold) {
asyncTask1(element).then(updatedElement => {
asyncTask2(updatedElement).then(elementFinal => {
array[index] = elementFinal;
});
});
return;
}
array[index] = normalSyncTask(element);
});
}
我需要此函数才能在处理完所有元素时返回更新的数组:
someFunction(array).then(updatedArray => {
// Do something with the updated array
});
这是我的尝试:
someFunction(array) {
var promises = [];
array.forEach((element, index) => {
if (some checks hold) {
var promise = asyncTask1(element);
promise.then(updatedElement => {
asyncTask2(updatedElement).then(elementFinal => {
array[index] = elementFinal;
});
});
promises.push(promise);
return;
}
array[index] = normalSyncTask(element);
});
return Promise.all(promises).then(() => Promise.resolve(array));
}
请原谅我的愚蠢尝试,但无论我读了多少教程,我都无法很好地理解承诺如何正常工作。
答案 0 :(得分:3)
这应该有效:
someFunction(array){
const promises = array.map((element, index) => {
if(some checks hold){
return asyncTask1(element).then(asyncTask2);
}
return normalSyncTask(element);
});
return Promise.all(promises).then((values) => {
console.log('Everything is OK', values);
});
}
您使用Array.map
生成一系列承诺,并等待使用Promise.all
解决所有承诺。
Promise.all
将忽略非承诺的值,并返回函数返回的values
数组中的promises结果。
答案 1 :(得分:1)
你的尝试非常接近
function someFunction(array) {
var promises = [];
array.forEach((element, index) => {
if (some checks hold) {
// push Promise from last async function
promises.push(asyncTask1(element).then(updatedElement => {
return asyncTask2(updatedElement).then(elementFinal => {
array[index] = elementFinal;
});
}));
return;
}
array[index] = normalSyncTask(element);
});
return Promise.all(promises).then(() => array);
}