ES8 async await

上文我们了解了Generator,并实现了一个Generator执行器,本文的async和await就十分容易理解了,其实也就是Generator的语法糖,js引擎内置了前文所写的执行器的Promise版。

asyncawait相比Generator有很多优点

1. 更加简单的写法

之前我们用Generator写异步得借助执行器

function run (gen) {
 return Promise.resolve({
   then: function (resolve, reject) {
     const iterator = gen()

     function step (nextFunc) {
       let result
       try {
         result = nextFunc()
       } catch (error) {
         return reject(error)
       }
       if (result.done) {
         return resolve(result.value)
       }
       Promise.resolve(result.value).then((v) => {
         step(function next () { return iterator.next(v) })
       }, (e) => {
         step(function next() { return iterator.throw(e) })
       })
     }
     step(function next () { return iterator.next(undefined) })
   }
 })
}


function getFileAsync (args) {
 return run(function * () {
   let content = yield promiseWrapper(fs.readFile)('./test.txt')
   let info = yield promiseWrapper(fs.stat)('./test.txt')
   return [content, info]
 })
}

getFileAsync()
.then(([content, stats]) => {
 console.log('文件内容:' + content.toString())
 console.log('文件大小:' + stats.size + ' 字节')
})
.catch((err) => {
 console.error(err)
}) 

不过有了asyncawait

async function getFile () {
 let content = await promiseWrapper(fs.readFile)('./test.txt')
 let info = await promiseWrapper(fs.stat)('./test.txt')
 return [content, info]
}

getFileAsync()
.then(([content, stats]) => {
 console.log('文件内容:' + content.toString())
 console.log('文件大小:' + stats.size + ' 字节')
})
.catch((err) => {
 console.error(err)
}) 

简单,清晰,明了,有木有?

2. 更加语义化

相比Generatoryield让人疑惑的语义,asyncawait显然更加富有语义。async表示函数为异步函数,await表示当前语句需要等待。

参考