javascript - 每个异步调用的特定任务并 promise 等待所有

标签 javascript async-await

像这样在 javascript 中使用异步是否安全:

async coolFunction(users) {
  const firstPromise = findPrivilegesInOneDbAsync();
  const secondPromise = findPrivilegesInSecondDbAsync();
//LABEL_1
  firstPromise.then(privilege=> {
    users.forEach(user => {
      if(user.privCode === privilege.code) {
        user.privileges.push(privilege);
      }
    }
  }
//LABEL_2
  secondPromise.then(privilege=> {
    users.forEach(user => {
      if(user.altPrivCode === privilege.differentCode) {
        user.privileges.push(privilege);
        user.hasAlternativePrvis = true;
      }
    }
  }
//LABEL_3
  Promise.all([firstPromise, secondPromise]).then(() => {
    console.log("DONE!");
    //do something
  })
}

问题是,是否保证 LABEL_3 - Promise.all 回调会在第一个和第二个 Promise(当然这两个 Promise 中的顺序并不重要)回调完成后执行?

最佳答案

...is it guaranteed that LABEL_3 - Promise.all callback gonna execute after first and second promise (order in those two of course does not matter) callbacks are done?

是的,确实如此。 Promise 上的履行处理程序按照注册顺序调用。由于您较早的项目是在 Promise.all 之前注册的,因此它们将首先运行。

示例:

function delay(ms, ...args) {
    return new Promise(resolve => {
        setTimeout(resolve, ms, ...args);
    });
}

const promise = delay(800);
promise.then(() => {
    console.log("first");
});

promise.then(() => {
    console.log("second");
});

但是使用 then 返回的 promise 可能会更惯用:

async coolFunction(users) {
  const firstPromise = findPrivilegesInOneDbAsync();
  const secondPromise = findPrivilegesInSecondDbAsync();
  Promise.all([
      firstPromise.then(privilege=> {
        users.forEach(user => {
          if(user.privCode === privilege.code) {
            user.privileges.push(privilege);
          }
        }
      },
      secondPromise.then(privilege=> {
        users.forEach(user => {
          if(user.altPrivCode === privilege.differentCode) {
            user.privileges.push(privilege);
            user.hasAlternativePrvis = true;
          }
        }
      }
  ])
  .then(() => {
    console.log("DONE!");
    //do something
  });
}

这还有一个优点,那就是在执行“完成”逻辑之前等待这些履行处理程序返回的任何 promise 。


可能值得注意的是,如果您要并行执行类似的操作并使用 .then 处理程序而不是 async,则该方法没有理由是 async 等待。不过,您可以这样做,以保持前两件事的并行处理,但等待它们都完成:

async coolFunction(users) {
  const firstPromise = findPrivilegesInOneDbAsync();
  const secondPromise = findPrivilegesInSecondDbAsync();
  await Promise.all([
      firstPromise.then(privilege=> {
        users.forEach(user => {
          if(user.privCode === privilege.code) {
            user.privileges.push(privilege);
          }
        }
      },
      secondPromise.then(privilege=> {
        users.forEach(user => {
          if(user.altPrivCode === privilege.differentCode) {
            user.privileges.push(privilege);
            user.hasAlternativePrvis = true;
          }
        }
      }
  ])
  console.log("DONE!");
  //do something
}

在执行“完成”逻辑之前,这还会等待这些履行处理程序返回的任何 promise 。

关于javascript - 每个异步调用的特定任务并 promise 等待所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182857/

相关文章:

c# - 如何使用javascript获取 session 值

javascript - 从 node.js 缓冲区中读取精度损失的 int64

wpf - 根据导航取消并启动新的异步任务

javascript - 如何在 JavaScript 中延迟重试异步函数?

javascript - react : function sending infinity GET requests

javascript - DOMSubtreeModified 在 chrome 中不起作用

javascript - 如何创建像大多数网站上那样的通用侧边栏?

javascript - Cypress.io 如何处理异步代码

Javascript async/await 函数 - 添加多个返回

.net - 异步等待方法比较