ES8 | async/await

107 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

ES系列文章

async/await

async/await是另一种异步方程的解决方案。比如es6中的Promise和Generator。es8中的 async/await异步解决方案比es6中的Promise和Generator更加优雅。

async

async函数就是Generator函数的语法糖

  • 普通函数
function foo() {
    return 'imooc'
}
console.log(foo())
async function foo(){
    return 'imooc' // Promise.resolve('imooc')
}
console.log(foo())

async函数执行成功会自动返回promise对象,async关键字必须写在function前面,Generator写在function后面

await

async function foo() {
    let result = await 'imooc'
    console.log(result)
}
foo()

await关键字后面应该是异步操作,而不是基本数据类型。

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()

async与await一些注意关键点小结

  • await关键字必须位于async函数内部
  • await关键字后面需要一个promise对象
  • await关键字的返回结果就是其后面Promise执行的结果,可能是resolved或者rejected的值,注意最后执行完的是个值。
  • 不能在普通箭头函数中使用await关键字,需要在箭头函数前面添加async
  • await用来串行的执行异步操作,现实现并行可以考虑promise.all
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)
})

应用场景

// 伪代码
//异步
async function request(){
    const data = await axios.get('http://www.xx.com')
    console.log(data)
}

有promise的列子 参考就行

import ajax from './ajax'

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()function foo() {
    return 'imooc'
}
console.log(foo())

async function foo(){
    return 'imooc' // Promise.resolve('imooc')
}
console.log(foo())

async function foo() {
    let result = await 'imooc'
    console.log(result)
}
foo()

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()

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)
})

// 伪代码
async function request(){
    const data = await axios.get('http://www.xx.com')
    console.log(data)
}

import ajax from './ajax'

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()

一个前端小白,若文章有错误内容,欢迎大佬指点讨论!