我想知道哪种语法更适合从异步函数返回数据和错误指示符。
选项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){
}
答案 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
}
让消费者按原样处理错误(如果发生的话),而无需在其周围附加多余的包裹。