1.基础认识:
iterator迭代器是为了解决多层循环嵌套遍历繁琐问题,generator是返回迭代器的函数,可以很好的控制异步执行。
2.生成器控制异步执行:
eg:
function run(taskFun) {
var task = taskFun();
//启动目标函数
var result = task.next();
//递归调用next执行
function step() {
if (!result.done) {
if (typeof result.value == 'function') {
result.value(function(err, data) {
if (err) {
result = task.throw(err);
return;
}
result = task.next(data);
step();
})
} else {
result = task.next(result.value)
step();
}
}
}
//启动step
step();
}
var fs = require("fs");
function readFile(filename) {
return function(callback) {
fs.readFile(filename, callback);
};
}
run((function*() {
var contents = yield readFile("./bar.js");
console.log(contents);
console.log("Done");
}))
输出结果:
readFile方法通过异步回调读取文件,异步回调处理可以优化为promise
function run(taskFun) {
var task = taskFun();
var result = task.next();
(function step() {//立即执行
if (!result.done) {
var promise = Promise.resolve(result.value);
promise.then(function(value) {
result = task.next(value);
step();
})
.catch(function(err) {
result = task.throw(err);
step();
})
}
})();
}
var fs = require("fs");
function readFile(filename) {
return new Promise(function(resolve, reject) {
fs.readFile(filename, function(err, content) {
if (err) {
reject(err);
}
resolve(content);
})
})
}
run((function*() {
var contents = yield readFile("./bar.js");
console.log(contents);
console.log("Done");
}))
输出结果与上图一样
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。