iterator迭代器是爲了解決多層循環嵌套遍歷繁瑣問題,generator是返回迭代器的函數,能夠很好的控制異步執行。promise
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"); }))
輸出結果與上圖同樣ui