【问题标题】:javascript - unable to get response from promise.all()javascript - 无法从 promise.all() 获得响应
【发布时间】:2022-01-28 12:12:12
【问题描述】:

我发现使用promise.all时无法得到响应。

下面的orders应该是一个数组

Promise.all(promises).then(function (orders) {
  console.log(orders); // nothing logged
});

完整代码

let promises = markets.map(async (mkt) => {
  return new Promise(async function (resolve, reject) {
    return functionA(paramA)
      .then(resA => {
        return res.functionB()
          .then((resB) => {
            if (resB.length > 0) {
              return functionC()
                .then(resC => {
                  console.log(resC); // successfully logged
                  return resC;
                });
            }
          });
      })
      .catch(err => console.log(err));
  });
});
Promise.all(promises).then(function (orders) {
  console.log(orders); // nothing logged
});

我该如何解决?

更新 1
我根据评论更新了代码。
orders 现在正在返回

(54) [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, Array(1), undefined, undefined, undefined, undefined, undefined, undefined, undefined, Array(1), undefined, Array(1), undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]

如果没有undefined,我如何让承诺返回?

const promises = markets.map(async mkt => {
  const resA = await functionA(paramA);
  const resB = await res.functionB();
  if (resB.length > 0) {
    const resC = await functionC()
    console.log(resC); // successfully logged
    return resC;
  }
});
Promise.all(promises).then(orders => {
  console.log(orders); // nothing logged
}, err => {
  console.log(err);
});

【问题讨论】:

标签: javascript promise


【解决方案1】:
  • Promise 构造函数忽略从其回调返回的任何值
  • 你没有在任何地方打电话给resolve
  • 当你调用一个已经给你一个 Promise 的函数时,你不需要构造一个 Promise
const promises = markets.map((mkt) => {
    return functionA(paramA)
        .then(resA => res.functionB())
        .then((resB) => {
            if (resB.length > 0) {
                return functionC()
                    .then(resC => {
                        console.log(resC); // successfully logged
                        return resC;
                    });
            }
        })
        .catch(handleError);
});

更好的方法是利用await 使代码扁平化且易于阅读。

const promises = markets.map(async (mkt) => {
    try {
        const resA = await functionA(paramA);
        const resB = await res.functionB();

        if (resB.length > 0) {
            const resC = await functionC()
            return resC;
        }
    } catch (e) {
        // handle errors
    }
});

您还可以考虑在 Promise.all 中处理错误,而不是在映射器中。

如果您只想包含调用了functionC 的项目,请在之后过滤掉空值。

Promise.all(promises).then(function (orders) {
  const filtered = orders.filter(Boolean);
  console.log(filtered);
});

【讨论】:

  • 请查看我上面的更新
【解决方案2】:

嗯,你从来没有 resolve()reject() 你正在创建的 new Promises。避免使用Promise constructor antipatternnever pass an async function as the executor to new Promise

通过使用async/await 而不是.then(),可以大大简化此代码:

const promises = markets.map(async mkt => {
  const resA = await functionA(paramA);
  const resB = await res.functionB();
  if (resB.length > 0) {
    const resC = await functionC()
    console.log(resC); // successfully logged
    return resC;
  }
});
Promise.all(promises).then(orders => {
  console.log(orders); // nothing logged
}, err => {
  console.log(err);
});

【讨论】:

  • 请查看我上面的更新
  • @CCCC 您从 else 异步函数不返回任何内容的情况中获取 undefined 值。只需在记录结果之前将它们过滤掉即可。
猜你喜欢
  • 2020-08-25
  • 2021-07-18
  • 2018-02-20
  • 2020-12-11
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多