【问题标题】:node using await in for loop which calls an async function在调用异步函数的 for 循环中使用 await 的节点
【发布时间】:2022-01-20 04:35:19
【问题描述】:

我在从我在 for 循环中调用的异步函数返回结果时遇到了一点麻烦,我应该返回一个字符串,但它返回的是一个承诺 我正在遵循这种语法,但我无法让它正常工作,我希望能深入了解为什么会失败https://eslint.org/docs/rules/no-await-in-loop

这是我正在尝试使用的函数,在这种情况下 decodeTheObject 是异步的并返回一个承诺,但如果我使用 await decodeTheObject eslint 会给我一个错误,说我不能在 for 循环中使用 await,不幸的是上面的解决方法仍然会导致返回一个承诺而不是一个已解决的值

async function decode (request, encodedObj) {
  const decodedArr = [];
  try{
    for (const id of encodedObj) {
      decodedArr.push({
        data: decodeTheObject(request, id), // this is an async function
        partial: true,
      });
    }
      await Promise.all(decodedArr);
      return decodedArr;

  }catch (err) {
    throwError(
      req,
      {
        errorDetails: [
          {
            issue: 'INVALID_ENCODING',
            description: 'Invalid encoded obj',
          },
        ],
      },
    );
  }
};


// ----- calling function -----

 const decodedObj = await decode(request, encodedItem);
  
  const payload = {
    newprop: decodedObj
  };



【问题讨论】:

    标签: node.js async-await


    【解决方案1】:

    Promise.all() 必须直接处理一系列承诺。您正在向它传递一个对象数组,这些对象不知道如何进入对象以获取承诺,因此,它不会完成任何有用的事情。有几种方法可以解决这个问题。

    这将依次等待每个异步调用,获取值并将值推送到数组中:

    async function decode (request, encodedObj) {
      const decodedArr = [];
      try{
        for (const id of encodedObj) {
          let data = await decodeTheObject(request, id);
          decodedArr.push({data, partial: true});
        }
        return decodedArr;
      } catch(e) {
         ...
      }
    }
    

    或者,您可以像这样通过创建一个 promise 数组并在该数组上使用 Promise.all() 来与 Promise.all() 并行运行它们:

    async function decode (request, encodedObj) {
        return Promise.all(encodedObj.map(id => {
            return decodeTheObject(request, id).then(data => {
               return {data, partial: true};
            });
        })).catch(err => {
           ...
        });
    }
    

    【讨论】:

    • 啊,好的,我现在明白了这个问题,谢谢你的解释,这个解决方案对我很有效,因为我知道我应该返回什么
    猜你喜欢
    • 2021-09-11
    • 2020-11-16
    • 2011-12-03
    • 2012-10-31
    • 2015-11-14
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多