Koa2学习async/await

Posted shenshangzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Koa2学习async/await相关的知识,希望对你有一定的参考价值。

Koa2学习(二)async/await

koa2中用到了大量的async/await语法,要学习koa2框架,首先要好好理解async/await语法。
async/await顾名思义是一个异步等待的语法,是es7中为了实现用同步的方式写异步方法的一种新式语法。

async

我们再来看看async到底是一个什么语法:

普通的方法:

function syncF() {
    return ‘I am a sync result‘
}
let sync_result = syncF()

console.log(sync_result)

结果:

I am a sync result

同步方法立即返回结果,大家都懂,就不解释了。

async的方法:

async语法 是 一个加持在函数定义时的声明:

async function asyncF() {
    return ‘I am a async result‘
}
let async_result = asyncF()

console.log(async_result)

结果:

Promise { ‘I am a asyncSync result‘ }

我们看到执行async的函数时,返回的是一个promise对象,既然是promise对象, 那就好理解了。
promise对象肯定会有一个then方法,用于处理异步结果,我们来试试:

async_result.then((res) => {
    console.log(res)
})

结果:

I am a asyncSync result

promise执行的结果会在then里面返回,没有问题。

await

await必须结合async来使用,顾名思义,是async wait (等待异步)的意思。

// 定义一个耗时3秒返回结果的函数
function delayF() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(‘I am a async result‘)
        }, 3000)
    })
}
// 定义一个async函数
async function testAwait() {
    let start = Date.now()
    console.log(await delayF())
    console.log(`cost ${Date.now() - start} ms`)
}
testAwait()

结果:

I am a async result
cost 3002 ms

await一般在等待async方法执行完毕,但是其实await等待的只是一个表达式,这个表达式在官方文档里说的是Promise对象,可是它也可以接受普通值。

async function testAsync() {
    return ‘testAsync‘
}
async function testAwait2() {
    let time1 = Date.now()

    await ‘1233‘
    let time2 = Date.now()
    console.log(`cost ${time2 - time1} ms`)

    await delayF()
    let time3 = Date.now()
    console.log(`cost ${time3 - time2} ms`)

    await testAsync()
    let time4 = Date.now()
    console.log(`cost ${time4 - time3} ms`)
}
testAwait2()

结果:

cost 1 ms
cost 3002 ms
cost 1 ms

总结

  • async是声明一个异步的函数,返回一个promise对象。
  • await是等待一个表达式(promise)的返回值执行完毕,必须结合async使用。
  • 写在await后面的方法都会等待await中的异步方法执行完毕之后再执行。


以上是关于Koa2学习async/await的主要内容,如果未能解决你的问题,请参考以下文章

《Koa2进阶学习笔记》完结

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

koa2快速上手(电商平台数据可视化实时监控系统)

描述Koa2洋葱模型

使用async/await——Nodejs+ExpressJs+Babel