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

输出结果:
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");
}))

输出结果与上图一样


Delia
75 声望3 粉丝

路漫漫其修远兮,吾将上下而求索。


引用和评论

0 条评论