我正在处理不支持ES6标准的旧项目。
为了便于理解,我将编写我要访问的代码,请翻译以下代码,而不使用异步/等待对。
async function doSomeCalls(arrayWithNeededCalls){
for(let i = 0; i < arrayWithNeededCalls.length; i++){
await makeSomeCall(arrayWithNeededCalls[i]);
console.log("Call: ", i, " Completed going to next one");
}
}
我尝试使用
Promise.all()
但是它不会等到一个诺言完成后再运行第二个诺言。
答案 0 :(得分:2)
您要依次等待诺言,因此应使用递归:
const doSomeCalls = (arrayWithNeededCalls) => {
const processCall = (index) => makeSomeCall(arrayWithNeededCalls[index]).then(res => {
console.log(`Call ${index} Completed going to next one`);
if (index < arrayWithNeededCalls.length) {
return processCall(index+1);
}
});
return processCall(0);
}
答案 1 :(得分:0)
更新: HRM评论看起来好多了:
由于OP忽略了诺言所返回的值,因此您可以执行以下操作:
arrayWithNeededCalls.reduce( (result, item) => result.then(() => makeSomeCall(item)), Promise.resolve() );
OLD: 如果您需要一一运行它们:
makeSomeCall(arrayWithNeededCalls[0])
.then(() => makeSomeCall(arrayWithNeededCalls[1]))
.then(() => makeSomeCall(arrayWithNeededCalls[2]))
.then(() => makeSomeCall(arrayWithNeededCalls[3]))
但是,如果您不知道确切的承诺,而只使用它们的兑现-await
是最佳解决方案