【发布时间】:2018-01-26 14:41:18
【问题描述】:
我将 async 函数传递给数组 reduce 函数。捕获传入函数抛出的错误的语法是什么?减少发生在 try catch 块内,它可以很好地捕获其他错误,但是如果传入的函数本身抛出错误,节点会给我一个 UnhandledPromiseRejectionWarning。
代码:
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();
}
}
(编辑)报告:
用await a; return client.query(b); 替换await client.query(b) 解决了这个问题。仅使用 await client.query(b),reduce 似乎 1) 生成一堆浮动的 client.query 调用,即使早期的承诺被拒绝,这些调用也会全部运行,并且 2) 导致未处理的承诺拒绝警告。使用 await a; return client.query(b); 会在第一次拒绝时停止执行,并且 catch 块会按原意捕获错误。
【问题讨论】:
-
您希望
result是什么?你为什么使用reduce?您希望doSomething任务同时发生吗? -
anArray是一组需要按顺序发生的 Postgres 查询。result是最终pg查询操作的结果,返回给调用函数。代码按照编写的方式工作,但模拟数据库错误会导致节点抛出UnhandledPromiseRejectionWarning。 -
实际上,您问题中的代码确实没有按顺序运行查询,
result始终是undefined。 -
射击。意外工作的代码是最糟糕的。代码肯定会按顺序执行
anArray中的项目,result肯定保持我期望的值。我错过了什么? -
您向我们展示了您的实际代码吗?什么是
doSomething- 也许它会进行一些内部排队?
标签: javascript error-handling async-await try-catch