如何在不使用异步/等待对的情况下使承诺彼此等待?

时间:2019-10-01 17:53:48

标签: javascript asynchronous promise

我正在处理不支持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()

但是它不会等到一个诺言完成后再运行第二个诺言。

2 个答案:

答案 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是最佳解决方案