节点在调用异步函数的 for 循环中使用 await

node using await in for loop which calls an async function

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

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

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
  };



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.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 => {
       ...
    });
}