ES6 Promise/Async/Await使用

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秒的, 说明是同步往下执行的, 这样修改之后程序是不是简洁很多呢, 对于日后维护起来也方便许多啦

异常处理

下面我们来看看如何进行异常处理, 在上面的栗子中我没有演示抛出异常和拒绝动作, 接下来看下如何处理异常和拒绝, 我们稍微改造一下代码, 像下面这样:

  1. 如果角色名称为空, 将抛出异常
  2. 如果角色等于zs, 拒绝, 无权查询
  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)
})

怎么处理大家看自己习惯和实际需求吧

你可能感兴趣的:(ES6,JavaScript,es6,javascript,前端,vue.js)