Koa2學習(二)async/await
阿新 • • 發佈:2018-11-17
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中的非同步方法執行完畢之後再執行。