koa2都支持async await了,咱們有什麼理由不用呢,既然要用,確定要先簡單瞭解下。promise
首先要說明的這是一個函數,就想function *(){}同樣,只是一個函數而已。只不過是函數,generator函數,async函數區分而已。koa
既然叫async函數,而不是普通函數,那麼它確定有本身的一些特性:async
async function test() { //throw new Error('hello error'); // await Promise.reject('hello error'); return 'hello world'; } test() .then(res => {console.log(res)}) .catch(err => {console.log(err.toString())})
async始終返回一個promise,函數
若是是return 一個val,那麼會經過promise.resolve(val)返回;koa2
若是拋出一個異常,async函數馬上終止執行,並經過promise.reject(err)返回;code
若是await遇到後面是一個reject狀態的promse,async函數當即終止,並返回該錯誤;對象
若是沒有顯示的return,那麼會經過promise.resolve()返回generator
###await 只能在async函數中it
就像yield必須在generator函數中同樣,一般await後面接的是一個promise對象io
/*聲明一個函數*/ async function test1(args) { console.log(args); return await 'hello world'; } /*在聲明一個函數,並在函數中調用*/ async function test2(args) { var test = await test1(args) return await test1(test); } /*聲明一個對象,把函數做爲它的屬性*/ var obj = { test3: async function(args) { return test2(args); } } obj.test3('i said ') .then(function(res) { console.log(res); }) .catch(function(err) { console.log(err); })
是否是和普通跟函數調用同樣呢