Promise应用
在工作中, 我们经常会遇到用异步请求数据, 查询一个结果, 然后把返回的参数放入到下一个执行的异步函数像这样:
$.ajax({..., success(resp)=>{$.ajax({..., resp.id, success(resp)=>{$.ajax({..., resp.name success(resp)=>{//多层嵌套的情况, 看着是不是很难受}})}})
}})
当我们使用Promise后, 我们的程序就变成了这样:
let userInfo = ()=> {return new Promise((resolve, reject) => {console.log('查询用户信息...')resolve('王二')})
}let orderInfo = (userName)=> {return new Promise((resolve, reject) => {console.log(`查询用户${userName}的订单信息...`)resolve('ORDER_20230820000000001')})
}userInfo().then(resp=>{return orderInfo(resp)
}).then(resp=>{console.log(resp)
})
控制台输出如下:
查询用户信息...
查询用户王二的订单信息...
ORDER_20230820000000001
async/await应用
看是不是简洁很多了, 如果你不想使用这种链式调用, 也可以结合async/await来实现同步执行, 我们来稍微改一下userInfo函数, 让它模拟异步请求, 像下面这样:
let userInfo = ()=> {return new Promise((resolve, reject) => {console.log(new Date().toLocaleString()+' 查询用户信息...')//这里我们模拟异步请求, 等待三秒setTimeout(() => {resolve('王二')}, 3000)})
}let orderInfo = (userName)=> {return new Promise((resolve, reject) => {console.log(new Date().toLocaleString()+` 查询用户${userName}的订单信息...`)resolve('ORDER_20230820000000001')})
}let main = async ()=> {let user = await userInfo()let order = await orderInfo(user);console.log(new Date().toLocaleString()+' '+order)
}
main()
控制台输出如下:
2023/8/20 10:52:23 查询用户信息...
2023/8/20 10:52:26 查询用户王二的订单信息...
2023/8/20 10:52:26 ORDER_20230820000000001
注意看上面输出, 第一行和第二行是间隔3秒的, 说明是同步往下执行的, 这样修改之后程序是不是简洁很多呢, 对于日后维护起来也方便许多啦
异常处理
下面我们来看看如何进行异常处理, 在上面的栗子中我没有演示抛出异常和拒绝动作, 接下来看下如何处理异常和拒绝, 我们稍微改造一下代码, 像下面这样:
- 如果角色名称为空, 将抛出异常
- 如果角色等于zs, 拒绝, 无权查询
- 否则可以查询
let userInfo = (roleName)=> {return new Promise((resolve, reject) => {console.log(new Date().toLocaleString() + ' 查询用户信息...')if (!roleName) {// 这里模拟抛出异常throw new Error('参数为空,查询异常')} else if (roleName === 'zs') {//拒绝标识return reject('无权查询')}//这里我们模拟异步请求, 等待三秒setTimeout(() => {resolve('王二')}, 3000)})
}let main = async ()=> {try{//let user = await userInfo()let order = await orderInfo(user);console.log(new Date().toLocaleString()+' '+order)}catch (err) {//这里处理reject和error信息console.error(typeof err === 'object'?err.message:err)}}
main()
参数为空时输出:
2023/8/20 11:18:51 查询用户信息...
参数为空,查询异常
参数为zs时输出:
2023/8/20 11:19:12 查询用户信息...
无权查询
参数为admin时输出:
2023/8/20 11:19:46 查询用户信息...
2023/8/20 11:19:49 查询用户王二的订单信息...
2023/8/20 11:19:49 ORDER_20230820000000001
当然异常处理也可以用其他方式, 例如, 你可以在Promise提供的then和catch中处理, 像下面这样:
userInfo('').then(resp=>{return orderInfo(resp)
}, err=>{//这里处理reject和error信息console.error(typeof err === 'object'?err.message:err)
})
或者像这样
userInfo('zs').then(resp=>{return orderInfo(resp)
}).catch(err=>{//这里处理reject和error信息console.error(typeof err === 'object'?err.message:err)
})
怎么处理大家看自己习惯和实际需求吧