【问题标题】:How to make promises wait each other without using async/await pair? [duplicate]如何在不使用异步/等待对的情况下让承诺相互等待? [复制]
【发布时间】:2020-01-31 01:15:11
【问题描述】:

我正在处理不支持 ES6 标准的旧项目。

为了便于理解,我将编写我想要达到的代码,请在不使用 async/await 对的情况下翻译以下代码。

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()

但它不会在运行第二个承诺之前等待一个承诺完成。

【问题讨论】:

  • 嗨,你能补充一下你到目前为止尝试过的东西吗?这不是编码服务,请尝试解决您的问题,如果您遇到问题,我们可以为您提供帮助。
  • arrayWithNeededCalls 映射到 Promises 并使用 Promise.all 并行或将 arrayWithNeededCalls 减少为一个 Promise
  • 你好@Nicolas,这段代码几乎是我想要实现的所有目标,但对于遗留项目来说是旧的方式。
  • 难道没有可以将新功能转换为旧标准的工具吗?通天塔什么的?

标签: javascript asynchronous promise


【解决方案1】:

更新: HRM 评论看起来好多了:

由于 OP 忽略了您可以执行的承诺返回的值:

arrayWithNeededCalls.reduce( (result, item) =&gt; result.then(() =&gt; makeSomeCall(item)), Promise.resolve() );

旧: 如果您需要一个一个运行它们:

makeSomeCall(arrayWithNeededCalls[0])
    .then(() => makeSomeCall(arrayWithNeededCalls[1]))
    .then(() => makeSomeCall(arrayWithNeededCalls[2]))
    .then(() => makeSomeCall(arrayWithNeededCalls[3]))

但是,如果您不知道确切的承诺,而只使用它们的数组 - await 是最好的解决方案

【讨论】:

  • 如果你不想并行处理它们,你应该将arrayWithNeededCalls减少到一个promise,那么arrayWithNeededCalls中的项目数量可以是动态的。
  • @HMR 你能解释一下如何一一减少吗? (非同时)
  • 由于 OP 忽略了您可以执行的承诺返回的值:arrayWithNeededCalls.reduce( (result, item) =&gt; result.then(() =&gt; makeSomeCall(item)), Promise.resolve() );
  • @HMR 是的,看起来不错
  • 您可以在答案中使用它
【解决方案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);
}

【讨论】:

  • 此解决方案是否会等待第一个承诺完成后再转到另一个解决方案?
  • Promise.all(...promiseArray);将同时执行它们,而不是一个一个地执行
  • 这将同时运行所有的 Promise。
  • @ChrisG 完全正确,因此这是错误的解决方案。问题中需要一一填写
  • @LevanLomia 我更新了对递归解决方案的响应,该解决方案一个接一个地运行所有承诺。
猜你喜欢
  • 2018-02-03
  • 2018-03-05
  • 1970-01-01
  • 2018-04-17
  • 2017-06-15
  • 1970-01-01
  • 2018-08-31
  • 2021-11-09
  • 2020-11-19
相关资源
最近更新 更多