在工作中, 我们经常会遇到用异步请求数据, 查询一个结果, 然后把返回的参数放入到下一个执行的异步函数像这样:
$.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来实现同步执行, 我们来稍微改一下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秒的, 说明是同步往下执行的, 这样修改之后程序是不是简洁很多呢, 对于日后维护起来也方便许多啦
下面我们来看看如何进行异常处理, 在上面的栗子中我没有演示抛出异常和拒绝动作, 接下来看下如何处理异常和拒绝, 我们稍微改造一下代码, 像下面这样:
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)
})
怎么处理大家看自己习惯和实际需求吧