【问题标题】:Call async function in map在地图中调用异步函数
【发布时间】:2021-04-05 20:50:43
【问题描述】:

我有下一个代码:

contents.map((content) => {
    const element = Object.assign({}, content);
    if (element.type === 'blabla') {
      element.data.id = await getId();
    }
    return element;
  });

但它失败并出现下一个错误:

“await”运算符只能用于“async”函数中

【问题讨论】:

  • (content) => {…} 确实不是async 函数
  • 更好的选择是将map 替换为for of 循环。
  • 这能回答你的问题吗? Use async await with Array.map

标签: javascript node.js


【解决方案1】:

使每个地图函数异步并使用Promise.all()

await Promise.all(contents.map(async content => ...);

Promise.all() 方法将一个可迭代的 Promise 作为输入,并返回一个 Promise,该 Promise 解析为输入 Promise 的结果数组。当输入的所有承诺都已解决,或者输入可迭代不包含任何承诺时,此返回的承诺将解决。它会在任何输入的 Promise 被拒绝或 non-Promise 抛出错误时立即拒绝,并会以第一个拒绝消息/错误来拒绝。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

请注意,这意味着所有内容项都是并行处理的。如果您想要顺序执行,请改用for ... of。每次迭代都可以根据需要await

【讨论】:

    【解决方案2】:

    只需在函数开始时添加异步即可。

    你不能在没有异步的情况下使用 await。

    contents.map(async (content) => {
        const element = Object.assign({}, content);
        if (element.type === 'blabla') {
          element.data.id = await getId();
        }
        return element;
      });
    

    你必须提供完整的代码才能得到正确的结果,我只是想告诉你你正在做的错误。

    【讨论】:

    • 我不认为“只添加异步”是正确的答案,因为他们很可能希望整个 map 也是异步的。
    • 但为此,他需要提供完整的代码。根据他的问题,这是让他知道自己缺少什么的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 2019-01-20
    • 1970-01-01
    • 2020-03-09
    • 2021-12-25
    • 2012-07-25
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多