以下是《深入掌握 ECMAScript 6 异步编程》系列文章的第三篇。
- Generator函数的含义与用法
- Thunk函数的含义与用法
- co函数库的含义与用法
- async函数的含义与用法
一、什么是 co 函数库?
co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行。
比如,有一个 Generator 函数,用于依次读取两个文件。
1 2 3 4 5 6 |
var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }; |
co 函数库可以让你不用编写 Generator 函数的执行器。
1 2 |
var co = require('co'); co(gen); |
上面代码中,Generator 函数只要传入 co 函数,就会自动执行。
co 函数返回一个 Promise 对象,因此可以用 then 方法添加回调函数。
1 2 3 |
co(gen).then(function (){ console.log('Generator 函数执行完成'); }) |
上面代码中,等到 Generator 函数执行结束,就会输出一行提示。
二、 co 函数库的原理
为什么 co 可以自动执行 Generator 函数?
前面文章说过,Generator 函数就是一个异步操作的容器。它的自动执行需要一种机制,当异步操作有了结果,能够自动交回执行权。
两种方法可以做到这一点。
(1)回调函数。将异步操作包装成 Thunk 函数,在回调函数里面交回执行权。
(2)Promise 对象。将异步操作包装成 Promise 对象,用 then 方法交回执行权。
co 函数库其实就是将两种自动执行器(Thunk 函数和 Promise 对象),包装成一个库。使用 co 的前提条件是,Generator 函数的 yield 命令后面,只能是 Thunk 函数或 Promise 对象。
上一篇文章已经介绍了基于 Thunk 函数的自动执行器。下面来看,基于 Promise 对象的自动执行器。这是理解 co 函数库必须的。
三、基于 Promise 对象的自动执行
还是沿用上面的例子。首先,把 fs 模块的 readFile 方法包装成一个 Promise 对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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()); }; |
然后,手动执行上面的 Generator 函数。
1 2 3 4 5 6 7 |
var g = gen(); g.next().value.then(function(data){ g.next(data).value.then(function(data){ g.next(data); }); }) |
手动执行其实就是用 then 方法,层层添加回调函数。理解了这一点,就可以写出一个自动执行器。
1 2 3 4 5 6 7 |
ȋ(二):Thunk 函数的含义和用法" href="http://web.jobbole.com/83818/" target="_blank">Thunk函数的含义与用法
一、什么是 co 函数库?co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行。 比如,有一个 Generator 函数,用于依次读取两个文件。
co 函数库可以让你不用编写 Generator 函数的执行器。
上面代码中,Generator 函数只要传入 co 函数,就会自动执行。 co 函数返回一个 Promise 对象,因此可以用 then 方法添加回调函数。
上面代码中,等到 Generator 函数执行结束,就会输出一行提示。 二、 co 函数库的原理为什么 co 可以自动执行 Generator 函数? 前面文章说过,Generator 函数就是一个异步操作的容器。它的自动执行需要一种机制,当异步操作有了结果,能够自动交回执行权。 两种方法可以做到这一点。
co 函数库其实就是将两种自动执行器(Thunk 函数和 Promise 对象),包装成一个库。使用 co 的前提条件是,Generator 函数的 yield 命令后面,只能是 Thunk 函数或 Promise 对象。 上一篇文章已经介绍了基于 Thunk 函数的自动执行器。下面来看,基于 Promise 对象的自动执行器。这是理解 co 函数库必须的。 三、基于 Promise 对象的自动执行还是沿用上面的例子。首先,把 fs 模块的 readFile 方法包装成一个 Promise 对象。
然后,手动执行上面的 Generator 函数。
手动执行其实就是用 then 方法,层层添加回调函数。理解了这一点,就可以写出一个自动执行器。
|