1、解决方案javascript
异步操做是 JavaScript 编程的麻烦事,麻烦到一直有人提出各类各样的方案,试图解决这个问题。java
从最先的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人以为不完全。它们都有额外的复杂性,都须要理解抽象的底层运行机制。shell
异步编程的最高境界,就是根本不用关心它是否是异步。编程
async 函数就是隧道尽头的亮光,不少人认为它是异步操做的终极解决方案。异步
一句话,async 函数就是 Generator 函数的语法糖。async
前文有一个 Generator 函数,依次读取两个文件。异步编程
var fs = require('fs'); var readFile = function (fileName){ return new Promise(function (resolve, reject){ fs.readFile(fileName, function(error, data){ if (error) reject(error); resolve(data); }); }); }; var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); };
写成 async 函数,就是下面这样。函数
var asyncReadFile = async function (){ var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); };
一比较就会发现,async 函数就是将 Generator 函数的星号(*)替换成 async,将 yield 替换成 await,仅此而已。ui
3、async优势spa
async 函数对 Generator 函数的改进,体如今如下三点。
(1)内置执行器。 Generator 函数的执行必须靠执行器,因此才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数如出一辙,只要一行。
var result = asyncReadFile();
(2)更好的语义。 async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操做,await 表示紧跟在后面的表达式须要等待结果。
(3)更广的适用性。 co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,能够跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操做)。