优秀的东西 就要学习和借鉴 上代码
// 第一代
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
var res = await aa()
console.info(res)
}
bb()
我模拟了 一个 利用promise 处理异步方法的 例子 这里 会随机返回正常的data 还是 报错
正常的图
报错的图
这里如果利用try catch 包裹 代码会比较臃肿
借鉴了别人的文章 代码可以稍作修饰 地址 https://blog.csdn.net/q3254421/article/details/88878288
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
var res = await aa().then(data => data).catch(err=>err)
console.info(res)
}
bb()
结果截图
可以看到 此时的报错已经不需要try catch的处理 不过 正确的还好 如果报错 res 就是报错的值 这样无法区分 结果的对错了
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
const [err, data] = await aa().then(data => [null, data] ).catch(err => [err, null])
console.info(err)
console.info(data)
}
bb()
这次就把 error 和data 进行了区分了
然后 我们将 aa的一长传代码二次封装一下
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
function to(callback) {
return callback.then(data => [null, data] ).catch(err => [err, null])
}
async function bb() {
const [err, data] = await to(aa())
console.info(err)
console.info(data)
}
bb()
运行结果是相同的 所以 我们 只是对 返回promise的方法进行了二次封装 为什么叫 to 呢 因为 这个东西已经有人封装好了啊
而且名字 就是 to.js 哈哈 地址 https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/
下载指令
npm i await-to-js
使用
import to from './to.js';
async function asyncTask() {
let err, user, savedTask;
[err, user] = await to(UserModel.findById(1));
if(!user) throw new CustomerError('No user found');
[err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
if(err) throw new CustomError('Error occurred while saving task');
if(user.notificationsEnabled) {
const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));
if (err) console.error('Just log the error and continue flow');
}
}