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)代码>解决了问题。使用justwait 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
。