我正在将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 client.query(b)
,reduce
似乎1)生成一堆浮动client.query
调用,即使先前的承诺被拒绝,所有调用都会运行,并且2)导致未处理的承诺拒绝警告。使用await a; return client.query(b);
会在第一次拒绝时停止执行,catch块会按原先的意图捕获错误。
答案 0 :(得分:2)
你需要对累加器中的promise(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);
}
}
答案 1 :(得分:0)
要避免UnhandledPromiseRejectionWarning
您可以将.catch()
链接到aFunction()
,或使用.then()
的第二个参数来处理被拒绝的Promise
或错误。
或者,将.catch()
链doSomethingTo(b)
调用以处理错误。