Koa2學習(二)async/await

Koa2學習(二)async/await

koa2中用到了大量的async/await語法,要學習koa2框架,首先要好好理解async/await語法。
async/await顧名思義是一個異步等待的語法,是es7中爲了實現用同步的方式寫異步方法的一種新式語法。javascript

async

咱們再來看看async究竟是一個什麼語法:java

普通的方法:

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

console.log(sync_result)

結果:promise

I am a sync result

同步方法當即返回結果,你們都懂,就不解釋了。bash

async的方法:

async語法 是 一個加持在函數定義時的聲明:框架

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

console.log(async_result)

結果:koa

Promise { 'I am a asyncSync result' }

咱們看到執行async的函數時,返回的是一個promise對象,既然是promise對象, 那就好理解了。
promise對象確定會有一個then方法,用於處理異步結果,咱們來試試:異步

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

結果:async

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中的異步方法執行完畢以後再執行。
相關文章
相關標籤/搜索