美文网首页
async / await异步函数

async / await异步函数

作者: 超人阿亮 | 来源:发表于2018-07-23 18:39 被阅读0次

async简介

async作为关键字放到函数前面,表示函数是异步函数,意味着该函数执行不会阻塞后面代码的执行。

async function timeout() {
    return 'hello world';
}
timout()

此时没有任何输出。

console.log(timeout())

此时console.log输出一个promise对象。
说明async函数返回的是promise对象;若要获取promise对象返回值,需要用then方法:

async function timeout(){
    return 'hello world'
}
timeout().then(result=>{
    console.log(result)
})
console.log('虽然在后面,但是我先执行')

控制台中,先打印‘虽然在后面,但是我先执行’,后打印‘hello world’。说明异步函数没有阻塞后面代码执行。

console.log(timeout())

上述代码打印的promise有一个resolved,

Promise {<resolved>:"hello world"}

这是async函数内部实现原理:如果async函数中有返回值,则当调用该函数时,内部会调用Promise.solve()方法把他转化为promise.resolve对象作为返回;但如果内部报错,则调用Promise.reject()返回一个promise对象。
据此修改timeout函数:

async function timeout(flag){
    if(flag){
        return "hello world"
    }else{
        return "failure"
    }
}
console.log(timeout(true))
console.log(timeout(false))

控制台打印如下:

Promise{<resolved>:'hello world'}
Promise{<rejected>:'failure'}

await简介

await是等待的意思,await关键字后面可以放任何表达式,不过更多的是放一个返回promise对象的表达式,注意await关键字只能放到async函数里面
构造一个函数,返回promise对象,作用是2秒以后让输入值乘以2:

function doubleAfter2seconds(num){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(2*num)
        },2000)
    })
}

现在再写一个async函数,从而可以使用await关键字,await后面放置的就是可以返回promise对象的表达式,即上面的doubleAfter2seconds函数:

async function test(){
    let result = await doubleAfter2seconds(100)
    console.log(result)
}

调用test函数,打开控制台,2s后输出200。
代码执行过程:调用test函数,里面遇到await,await表示等候,代码走到这,就暂停在这里不继续向下执行了,等候promise对象执行完毕。然后拿到promise.resolve的值并返回。返回值拿到以后,再继续执行。具体到上述代码:遇到await之后,代码暂停执行,等待doubleAfter2seconds(100)执行完毕,doubleAfter2seconds(100)返回的promise开始执行,2秒之后,promise resolve了,返回了200,赋值给result,暂停结束,代码才开始继续执行。
这个函数无法看出async/await的作用,但如果把三个doubleAfter2seconds()函数的结果相加呢?

async function tribleTest(){
    let first = await doubleAfter2seconds(100);
    let second = await doubleAfter2seconds(100);
    let third = await doubleAfter2seconds(100);
    console.log(first + second + third);
}

6秒后,输出600。异步函数变成同步。

相关文章

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • dart(五)--异步、生成器

    异步 async,await 可以使同步代码异步执行。只有在async的函数里可以使用await。该函数执行到aw...

  • async-await

    1 async-await 1 异步函数 async function async关键字用于声明一个异步函数: a...

  • async await 异步的简单用法

    async 是声明一个异步函数,如 async ()=>{} await 是等待一个异步方法执行,await 执行...

  • 2020-05-06--Vue之前后端交互6-async,awa

    async,await async:‘异步’ await:‘等待’ async作为一个关键字放到函数前面 任何一个...

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • 笔记总结

    一、ES8(async/await)异步函数 ES8: async await 注意:async必须要去修饰一个函...

  • async函数用法

    async await ES2017 标准引入了 async 函数,使得异步操作变得更加方便。async 函数是什...

  • Async/Await替代Promise的6个理由

    Async/Await简介 async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 a...

  • Async/Await简介与用法

    简介 async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是...

网友评论

      本文标题:async / await异步函数

      本文链接:https://www.haomeiwen.com/subject/nowjmftx.html