koa2中用到了大量的async/await語法,要學習koa2框架,首先要好好理解async/await語法。
async/await顧名思義是一個異步等待的語法,是es7中爲了實現用同步的方式寫異步方法的一種新式語法。javascript
咱們再來看看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 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必須結合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