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

时间:2017-08-18 02:41:31

标签: javascript error-handling async-await try-catch

我正在将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块会按原先的意图捕获错误。

2 个答案:

答案 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)调用以处理错误。