ASYNC分析

1、解决方案javascript

异步操做是 JavaScript 编程的麻烦事,麻烦到一直有人提出各类各样的方案,试图解决这个问题。java

从最先的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人以为不完全。它们都有额外的复杂性,都须要理解抽象的底层运行机制。shell

异步编程的最高境界,就是根本不用关心它是否是异步。编程

async 函数就是隧道尽头的亮光,不少人认为它是异步操做的终极解决方案。异步

2、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 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操做)。

相关文章
相关标签/搜索