从异步函数返回错误和数据的更好语法

时间:2019-12-03 06:45:32

标签: javascript node.js ecmascript-6

我想知道哪种语法更适合从异步函数返回数据和错误指示符。

选项1:

dailyTasks.doSomething = async function () {    ​
    try {
        doSomethingHere();
        return [null, {
            status: 'done'
        }]
​
    } catch (e) {
        return [e, null];
    }
};

然后对该函数的调用将是:

const [error, data] = await dailyTasks.doSomething();
if (error){
}

选项2:

dailyTasks.doSomething = async function () {    ​
    try {
        doSomethingHere();
        return {
            error: null,
            data: {
                status: 'done'
            }
        };
​
    } catch (e) {
        return {
            error: e,
            data: null
        };
    }
};

然后对该函数的调用将是:

const {error, data} = await dailyTasks.doSomething();
if (error){
}

2 个答案:

答案 0 :(得分:1)

您只需要在最高级的呼叫中捕获错误,例如我有服务器端点,在那里我调用了一些业务逻辑方法:

router.post('/', async (req, res) => {
  try {
    const result = await myBusinessFunction();
    res.status(200).send(result);
  } catch (err) {
    console.error(err);
    res.status(500).send('internal  server error');
  }
})

在随后的myBusinessFunction调用中没有捕获错误,仅在端点中捕获错误。 如果调用3d party lib,控制其错误代码或引入单独的上下文(如setTimeout,setInterval),则可能需要捕获错误。

答案 1 :(得分:0)

由于该函数是异步的,因此它返回一个Promise。来自async函数的错误的适当指示符可能是针对它返回拒绝的诺言:

dailyTasks.doSomething = async function () {
  // do something asynchronous
  await doSomethingHere();
  return { status: done };
};

try {
  await dailyTasks.doSomething();
} catch(e) {
  // handle errors
}

消费者按原样处理错误(如果发生的话),而无需在其周围附加多余的包裹。