await等待处理的是一个Promise协议,那么利用以下这种方式将错误导出至同一个逻辑层再处理就能不用写那么多try/catch了。
// to.js
export default function to(promise) {
return promise.then(data => {
return [null, data];
})
.catch(err => [err]);
}
import to from './to.js';
async function asyncTask(cb) {
let err, user, savedTask;
[err, user] = await to(UserModel.findById(1));
if(!user) return cb('No user found');
[err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
if(err) return cb('Error occurred while saving task');
if(user.notificationsEnabled) {
const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));
if(err) return cb('Error while sending notification');
}
cb(null, savedTask);
}
另外async await需要注意以下:
async function x() {
await y();
}
async function y() {
await x();
}
x() //Uncaught (in promise) RangeError: Maximum call stack size exceeded
网友评论