ES6 Promise/Async/Await使用

news/2024/7/10 23:53:06 标签: es6, javascript, 前端, vue.js

Promise应用

在工作中, 我们经常会遇到用异步请求数据, 查询一个结果, 然后把返回的参数放入到下一个执行的异步函数像这样:

javascript">$.ajax({..., success(resp)=>{
	$.ajax({..., resp.id, success(resp)=>{
		$.ajax({..., resp.name success(resp)=>{
			//多层嵌套的情况, 看着是不是很难受
		}})
	}})
}})

当我们使用Promise后, 我们的程序就变成了这样:

javascript">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函数, 让它模拟异步请求, 像下面这样:

javascript">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. 否则可以查询
javascript">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中处理, 像下面这样:

javascript">userInfo('').then(resp=>{
    return orderInfo(resp)
}, err=>{
    //这里处理reject和error信息
    console.error(typeof err === 'object'?err.message:err)
})

或者像这样

javascript">userInfo('zs').then(resp=>{
    return orderInfo(resp)
}).catch(err=>{
    //这里处理reject和error信息
    console.error(typeof err === 'object'?err.message:err)
})

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


http://www.niftyadmin.cn/n/4953973.html

相关文章

【C++学习】模板进阶

目录 一、非类型模板参数 二、模板特化 2.1 概念 2.2函数模板特化 2.3类模板特化 2.3.1全特化 2.3.2偏特化 2.3.3 类模板特化应用示例 三、模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3解决方法 四、模板总结 一、非类型模板参数 模板参数分类型形参…

File详解

目录 1. 概述 2. File的常见成员方法(判断、获取) 3. File的常见成员方法(创建、删除) 4. File的常见成员方法(获取并遍历) 1. 概述 File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径 这个路径可以是存在的,也允许是不存在的 方法名称…

css整体使用

文章目录 html与csshtml、css与排版响应式与自适应布局自适应布局响应式布局 css规则class、id、以及默认的标签名的优先级 css书写位置flex整体逻辑 bootstrap资源 html与css html负责网页功能,css负责网页美化;浏览器本身有一套默认的css样式&#xf…

Springboot如何实现自动装配

Springboot如何实现自动装配 ​ 自动装配就是把第三方的Bean装载到Spring IOC中,不需要开发人员再去手动写那些Bean的装配配置。 ​ Springboot真正实现自动自动注解的是因为SpringBootApplication里面的EnableAutoConfiguration。 ​ 引入Starter启动组件的时候…

[mysql系列] mysql 数据库如何实现事务回滚

这里写自定义目录标题 一、事务回滚二、mysql InnoDB引擎如何实现回滚操作2.1 InnoDB引擎的 undo log2.2 具体实现2.2.1 insert 操作2.2.2 delete 操作2.2.3 update 操作 主要参考资料为:《Mysql 是怎样运行的》 一、事务回滚 根据原子性的定义,一个事务…

【0基础入门Python笔记】二、python 之逻辑运算和制流程语句

二、python 之逻辑运算和制流程语句 逻辑运算控制流程语句条件语句(if语句)循环结构(for循环、while循环)continue、break和pass关键字控制流程语句的嵌套以及elif 逻辑运算 Python提供基本的逻辑运算:不仅包括布尔运…

【数据结构】链表的回文结构

文章目录 🌏引言🧭[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking)🚩🚩题目描述&#xf…

使用SpringBoot+SpringMVC+Mybatis+WebSocket实现云聊天项目

云聊天 1. 项目介绍 本项目是仿照微信实现网页版聊天程序,用户注册登录后可与在线好友实时聊天,下线好友上线后可以查看到好友发送的消息;用户可以在搜索框搜索用户添加好友;用户还可以查看好友申请列表,选择是否同意…