生成器的异步操作
异步操作
所谓"异步",简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段
Generator
Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权, 来源于协成, 协成是为了解决多任务并行执行而提出的, 异步编程也可以看成是这个东西
thunk 函数
thunk 函数是自动执行 Generator 函数的一种方法。
编译器的“传名调用”实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫做 Thunk 函数
var thunk = function () { return x + 5; }; function f(thunk) { return thunk() * 2; }
求值策略
函数参数何时计算的问题
传值调用
参数传入之前计算
传名调用
参数直接传入, 使用的时候再计算
js 的 thunk 就是把多个参数的传值调用变为传明调用
generator 无法自动执行多个异步操作, 因为 next 和 next 之间无法判断上一个 next 是否异步已经完成了, 为了确保上一个 next 玩抽异步操作后才执行下一步, 需要引入 thunk
在 thunk 的回调函中把执行权返回
function run(fn) { var gen = fn(); function next(err, data) {
// 这个代码写的确实常人无法理解
// next 返回的死一个 chunk 函数, data 被传入放在了 f* 中 var result = gen.next(data); if (result.done) return;
// 这里确保了在执行完成异步操作后才会执行下一个. 但是如果有回调的逻辑怎么办??? 把 next 封装在一个函数中吗 result.value(next); } next(); }
var g = function* (){
var f1 = yield readFileThunk('fileA');
var f2 = yield readFileThunk('fileB');
// ...
var fn = yield readFileThunk('fileN');
};
run(g);
co 模块是一种 generato 自动执行模块
generator 最大的作用应该是可以暂停回复一个函数的执行, 这种特性可以让多个函数做协调的执行, 达到协程的作用. 感觉对异步编程来说确实是一种新的方式
但是感觉还是依赖于回调函数啊, 有些东西还是没分清, 除了解决了回调地狱, 相比于 promise 没有啥优势啊