iterator & generator

1.基礎認識:

iterator迭代器是爲了解決多層循環嵌套遍歷繁瑣問題,generator是返回迭代器的函數,能夠很好的控制異步執行。promise

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");
}))

輸出結果:
image.png函數

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

相關文章
相關標籤/搜索