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

链接地址: http://www.djcxy.com/p/26623.html

上一篇: JavaScript error handling async function passed to reduce

下一篇: pdo should i try/catch every query?