【ES6】async await异步操作解决方案


一、async/await

ES2017 标准引入了 async 函数,使得异步操作变得更加方便。async 函数是 Generator 函数的语法糖。
async 函数就是将 Generator 函数的星号( * )替换成 async ,将 yield 替换成 await ,仅此而已。
async 函数对 Generator 函数的改进,体现在以下四点:

  • 内置执行器。
    Generator 函数的执行必须靠执行器,所以才有了 co 模块,而 async 函数自带执行器。也就是说, async 函数的执行,与普通函数一模一样,只要一 行。
  • 更好的语义。
    async 和 await ,比起星号和 yield ,语义更清楚了。 async 表示函数里有异步操作, await 表示紧跟在后面的表达式需要等待结果。
  • 更广的适用性。
    co 模块约定, yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以是 Promise 对象和原始类型的值(数值、字 符串和布尔值,但这时等同于同步操作)。
  • 返回值是 Promise。
    async 函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用 then 方法指定下一步的操作。 进一步说, async 函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而 await 命令就是内部 then 命令的语法糖。

二、用法详解

1. 基本用法

// 普通函数
function foo() {
    return 'kakaDorothy'
}
console.log(foo())

// async
async function foo(){
    return 'kakaDorothy' // 与Promise.resolve('kakaDorothy')的作用一样
}
console.log(foo()) // 返回promise对象

async function foo() {
    let result = await 'kakaDorothy' // 通常跟上异步操作
    console.log(result)
}
foo()

2. 异步操作

function timeout() {
    return new Promise(resolve => {
        setTimeout(()=>{
            // console.log(1)
            resolve(1)
        }, 1000)
    })
}

async function foo(){
    const res = await timeout()
    console.log(res)
    console.log(2)
}
foo()
// 1 2

如果是失败的情况:

function timeout() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve('success')
            reject('fail')
        }, 1000)
    })
}
async function foo() {
    return await timeout()
}
foo().then(res => {
    console.log(res);
}).catch(err => {
    console.log(err)
})
// fail

3. 用于ajax请求

axios是发送ajax的一种方式

// 伪代码
async function request(){
    const data = await axios.get('http://www.xx.com')
    console.log(data)
}
function ajax(url, callback) {
    // 1、创建XMLHttpRequest对象
    var xmlhttp
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest()
    } else { // 兼容早期浏览器
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP')
    }
    // 2、发送请求
    xmlhttp.open('GET', url, true)
    xmlhttp.send()
    // 3、服务端响应
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
            var obj = JSON.parse(xmlhttp.responseText)
            // console.log(obj)
         	callback(obj)
        }
    }
}

function request(url) {
    return new Promise(resolve => {
        ajax(url, res => {
            resolve(res)
        })
    })
}
async function getData(){
    const res1 = await request('static/a.json')
    console.log(res1)
    const res2 = await request('static/b.json')
    console.log(res2)
    const res3 = await request('static/c.json')
    console.log(res3)
}
getData()
// {a: "我是A"}
// {b: "我是B"}
// {c: "我是C"}

总结

async需要卸载function关键字前面,async/await 需要成对出现,且await需要写在函数内部。
async/await 与Promise一样也是一种异步操作解决方案,但它不需要写then不需要写回调函数,让代码更加简洁,减少了代码嵌套,把异步的代码以同步的写法呈现,这样代码的可读性更强,同时也增加了可维护性。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
async await 异步嵌套是指在异步操作中使用 asyncawait 关键字来处理多个嵌套的异步请求。在提供的代码示例中,通过 asyncawait 实现了异步嵌套处理。 在 created 方法中调用了 getKpiRoleButton 方法,该方法使用了 async 关键字来声明一个异步函数。在该方法内部,通过 await 关键字等待 signKpiRoleIdSearch 方法的返回结果。signKpiRoleIdSearch 方法返回了一个 Promise 对象。在 Promise 的回调函数中,使用了 this.$http.get 方法发送了一个 GET 请求,并通过 localStorage.getItem("id") 获取了 userId。当接收到返回结果后,如果 res.data.success 为真,则调用了 resolve 方法将结果返回。 在 getKpiRoleButton 方法内部,通过 await 关键字等待 signKpiRoleIdSearch 方法的返回结果,并将结果赋值给 resultObj。然后,使用 kpiAPI.kpiPermissionsButton 方法发送一个带有 roleId 参数的请求,并在 then 方法中处理返回结果。 通过使用 asyncawait,可以使异步嵌套的处理更加清晰和简洁。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [JS基于ES6新特性async await进行异步处理操作示例](https://download.csdn.net/download/weixin_38519681/14808936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue 使用async await处理异步嵌套请求](https://blog.csdn.net/weixin_43173924/article/details/106093600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值