如何在写awaitasync的时候不⽤trycatch
在js的⽇常使⽤中,异步操作是经常会⽤到的,promise 和 await/async可以避免会掉地狱的痛苦。
我们可以⽤promise的链式回调处理异步结果,但是当有多个异步需要处理的时候也会避免不了要⽤⼀串的then函数来处理function asyncTask(cb) {
asyncFuncA.then(AsyncFuncB)
.then(AsyncFuncC)
.then(AsyncFuncD)
.then(data => cb(null, data)
.catch(err => cb(err));
}
这个时候可以⽤await/async来处理多个异步调⽤的情况
async function asyncTask(cb) {
const user = await UserModel.findById(1);
if(!user) return cb('No user found');
const savedTask = await TaskModel({userId: user.id, name: 'Demo Task'});
ificationsEnabled) {
await NotificationService.sendNotification(user.id, 'Task Created');
}
if(savedTask.assignedUser.id !== user.id) {
await NotificationService.sendNotification(savedTask.assignedUser.id, 'Task was created for you');
}
cb(null, savedTask);
}
这样看的话异步可以像同步那样处理很简洁易读,但是错误的捕获却做不到,这⾥需要⽤到try/catch来做错误的处理async function asyncTask(cb) {
try {
const user = await UserModel.findById(1);
if(!user) return cb('No user found');
} catch(e) {
return cb('Unexpected error occurred');
}
try {
const savedTask = await TaskModel({userId: user.id, name: 'Demo Task'});
} catch(e) {
return cb('Error occurred while saving task');
}
ificationsEnabled) {
try {
await NotificationService.sendNotification(user.id, 'Task Created');
} catch(e) {
return cb('Error while sending notification');
}
}
if(savedTask.assignedUser.id !== user.id) {
try {
await NotificationService.sendNotification(savedTask.assignedUser.id, 'Task was created for you');
} catch(e) {
return cb('Error while sending notification');
}
}
cb(null, savedTask);
}
所以就成了上⾯这样,这样看来代码量和简洁程度都不是很友好,为了能够使异步可以像写同步⼀样易于理解,以及代码尽量简单减少嵌套,可以考虑封装⼀种函数拥有promise的便捷错误处理和await/async的简洁的写法,因为await 后⾯本来就是⼀个promise所以我们直接可以先处理promise ⽤catch来捕获error,在返回⼀个promise 交给await处理。
export default function to(promise) {
return promise.then(data => {
try catch的使用方法return [null, data];
})
.catch(err => [err]);
}
下⾯我们来测试⼀下这个⽅法的可⾏性
function taskPromise(status) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (status === "fail") {
return reject("error")
} else {
return resolve("success")
}
}, 1000)
})
}
async function asyncTasks() {
let err, result
[err, result] = await to(taskPromise(""))
if (err) {
console.log("it‘s error")
} else {
console.log("it‘s" + result)
}
[err, result] = await to(taskPromise("fail"))
if (err) {
console.log("it‘s error")
} else {
console.log("it‘s" + result)
}
}
asyncTasks() //it‘ssuccess it‘s error
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论