JavaScript错误处理传递给reduce的异步函数

JavaScript错误处理传递给reduce的异步函数,javascript,error-handling,async-await,try-catch,Javascript,Error Handling,Async Await,Try Catch,我正在将一个async函数传递给一个数组reduce函数。捕获传入函数抛出的错误的语法是什么?减少发生在一个trycatch块中,该块可以很好地捕获其他错误,但是如果传入的函数本身抛出错误,节点会给我一个未处理PromisejectionWarning 代码: aFunction = async (anArray) => { try { const result = await anArray.reduce(async (a, b) => { await do

我正在将一个
async
函数传递给一个数组
reduce
函数。捕获传入函数抛出的错误的语法是什么?减少发生在一个
try
catch
块中,该块可以很好地捕获其他错误,但是如果传入的函数本身抛出错误,节点会给我一个
未处理PromisejectionWarning

代码:

aFunction = async (anArray) => {
  try {
    const result = await anArray.reduce(async (a, b) => {
      await doSomethingTo(b);
    }, Promise.resolve());

    return result;
  }

  catch (error) {
    winston.error(error);
  }  
}
exports.chainedQueryDB = async (queries, finalTask, download) => {
  let client = await pool.connect();
  try {
    winston.info(`Begin chained table query.`);
    // Loop through query array
    const result = await queries.reduce(async (a, b) => {
      await client.query(b);
    }, Promise.resolve());

    if (download) {
      return streamOut(download, client);
    }

    return result.rows;
  }

  catch (error) {
    throw error;
  }

  finally {
    const final = await client.query(finalTask);
    winston.info(`Temp table dropped.`);
    client.release();
  }
}
(编辑)实际代码:

aFunction = async (anArray) => {
  try {
    const result = await anArray.reduce(async (a, b) => {
      await doSomethingTo(b);
    }, Promise.resolve());

    return result;
  }

  catch (error) {
    winston.error(error);
  }  
}
exports.chainedQueryDB = async (queries, finalTask, download) => {
  let client = await pool.connect();
  try {
    winston.info(`Begin chained table query.`);
    // Loop through query array
    const result = await queries.reduce(async (a, b) => {
      await client.query(b);
    }, Promise.resolve());

    if (download) {
      return streamOut(download, client);
    }

    return result.rows;
  }

  catch (error) {
    throw error;
  }

  finally {
    const final = await client.query(finalTask);
    winston.info(`Temp table dropped.`);
    client.release();
  }
}
(编辑)报告:
等待客户。查询(b)
替换为
等待a;返回client.query(b)解决了问题。使用just
wait client.query(b)
reduce
似乎1)生成一组浮动
客户端。query
调用即使先前的承诺被拒绝也会运行,2)导致未处理的承诺拒绝警告。使用
等待a;返回client.query(b)
在第一次拒绝时停止执行,catch块按照最初的预期捕获错误。

您还需要对累加器中的承诺(参数
a
进行处理-
等待它,通过安装
.catch()
回调来处理它的错误,与
doSomething(b)
同时等待。对于顺序执行,您可以

async function aFunction(anArray) {
  try {
    return await anArray.reduce(async (a, b) => {
      await a; // make sure the previous query is done
      return doSomethingTo(b);
    }, Promise.resolve());
  } catch (error) {
    winston.error(error);
  }
}
我建议不要在这里使用
reduce

async function aFunction(anArray) {
  try {
    let result;
    for (const b of anArray) {
      result = await doSomethingTo(b);
    }
    return result;
  } catch (error) {
    winston.error(error);
  }
}

要避免出现未处理的PromiserEjectionWarning(PromiserEjectionWarning),您可以将
.catch()
链接到
aFunction()
调用或使用
的第二个参数。然后()
处理拒绝的
承诺或错误


或者,将
.catch()
链接到
doSomethingTo(b)
调用以处理错误。

您希望
结果是什么?为什么要使用
reduce
?是否希望同时执行
doSomething
任务?
anArray
是一组需要按顺序执行的Postgres查询
result
是最终pg查询操作的结果,并返回给调用函数。代码按编写的方式工作,但模拟数据库错误会导致节点抛出
未处理PromisejectionWarning
。实际上,问题中的代码不会按顺序运行查询,并且
结果
始终是
未定义的。意外工作的代码是最糟糕的。代码明确地按顺序执行
anArray
中的项目,并且
result
明确地保留我期望的值。我遗漏了什么?你给我们看了你的实际代码了吗?什么是
doSomething
-可能会进行一些内部排队?答案如何解决问题中描述的问题?@guest271314它显示了如何避免未处理的拒绝警告。问题代码和答案代码之间有什么区别?@guest271314您没有看到什么区别吗?很明显,它们是两种不同的东西。@sheepgobeep是的。(它可能是
等待doSomething(b)
而不是
返回
,这没有什么区别)。但是通过等待
a
,我们不会让
a
承诺——上一次迭代的结果——无处可寻。也许在一张纸上写出
reduce
对回调和累加器的作用会有所帮助,例如,三个元素的
anArray