JavaScript错误处理异步函数传递给reduce
我将一个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 client.query(b)
await a; return client.query(b);
await a; return client.query(b);
解决了这个问题。 仅仅await client.query(b)
, reduce
似乎1)会产生一堆浮动的client.query
调用,即使先前的承诺被拒绝也会运行,并且2)导致未处理的promise拒绝警告。 用await a; return client.query(b);
await a; return client.query(b);
在第一次拒绝时停止执行,catch块根据最初的计划捕获错误。
您还需要对accumulator( a
参数)中的承诺进行一些操作 - await
它,通过安装.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);
}
}
为了避免UnhandledPromiseRejectionWarning
你可以链.catch()
以aFunction()
调用或利用的第二个参数.then()
来处理被拒绝Promise
或错误。
或者,链接.catch()
以doSomethingTo(b)
调用来处理错误。
上一篇: JavaScript error handling async function passed to reduce