如何等待多个 Promise.all()

ffx*_*292 3 javascript promise es6-promise

我正在使用一些旧代码,并尝试返回两个承诺数组的结果。

所以基本上主体包含first和second是 id 数组。我知道下面的代码适用于 1 到 5 个 id 的小数组,但如果我要做几百个,在我从两个 Promise 数组中获得数百个结果之前,解析是否会触发?

 const doSomething = (body) => {
    return new Promise((resolve, reject) => {
      const promisesOne = body.first.map((id) => 
        doSomethingOne(id)
      );

      const promisesTwo = body.second.map((id) => 
        doSomethingTwo(id)
      );

      let response = {
        first: {}
        second: {}
        headers: 'mock headers'
      };

      Promise.all(promisesOne).then((results) => {
        response.first = results;
      });

      Promise.all(promisesTwo).then((results) => {
        response.second = results;
      });

      resolve(response);
  });
};
Run Code Online (Sandbox Code Playgroud)

另外,我无法将其重构为 async/await,因为此代码库不使用它。

Phi*_*hil 5

在我从两个 Promise 数组中得到 ... 结果之前,解析会触发吗?

是的,绝对是因为您没有等待他们解决。

只需将两个Promise.all()承诺包装在另一个承诺中Promise.all()以等待一切,然后创建您想要的最终对象。

const doSomething = (body) => {
  return Promise.all([
    Promise.all(body.first.map(doSomethingOne)),
    Promise.all(body.second.map(doSomethingTwo)),
  ]).then(([first, second]) => ({
    first,
    second,
    headers: "mock headers",
  }));
};
Run Code Online (Sandbox Code Playgroud)

body您可以通过创建属性名称到其相应映射函数的映射来使其通用。例如

const mappers = {
  first: doSomethingOne,
  second: doSomethingTwo,
};

const doSomething = (body) => {
  return Promise.all(
    Object.entries(mappers).map(([key, mapper]) =>
      Promise.all(body[key].map(mapper)).then((data) => ({ [key]: data }))
    )
  )
  .then((results) => Object.assign({ headers: "mock headers" }, ...results));
};
Run Code Online (Sandbox Code Playgroud)