Generator function基于Promise对象的自动执行

  var fs = require('fs');

  var readFile = function ( fileName ) {
    return new Promise(function ( resolve, reject ) {
      fs.readFile(fileName, function ( err, data ) {
        if (err) {
          return reject(err);
        }

        return resolve(data);
      });
    });
  };

  var gen = function* () {
    var f1 = yield readFile('/etc/fstab');
    var f2 = yield readFile('/etc/shells');
    console.log(f1.toString());
    console.log(f2.toString());
  };

  /*
  g.next().value.then(function ( data ) {
    g.next(data).value.then(function ( data ) {
      g.next(data);
    });
  });
  */

  var run = function () {
    let g = gen();

    let next = function ( data ) {
      let result = g.next(data);
      if (result.done) {
        return  result.value;
      }

      result.value.then(function (data) {
        next(data);
      });
    };

    next();
  };

  run(gen);

// spawn自动执行器函数的实现
var spawn = function ( genFunc ) {
    return new Promise(function ( resolve, reject ) {
        let g = genFunc();

        let next = function (nextFunc) {
            try {
                let nextF = nextFunc();

                if (nextF.done) {
                    return resolve(nextF.value);
                }

                Promise.resolve(nextF.value)
                    .then(
                        function ( v ) {
                            next(function () {
                                return g.next(v);
                            });
                        },
                        function ( e ) {
                            next(function () {
                                return g.throw(e);
                            });
                        });
            } catch (e) {
                return reject(e);
            }
        };

        next(function () {
            // return g.next(undefined);
            return g.next();
        });
    });
};

spawn(gen)
    .then(function () {
        console.log("function success ...");
    })
    .catch(function ( e ) {
        console.log(e);
    });

手动执行Generator函数,其实就是用then方法,层层添加回调函数。

var g = gen();
g.next().value.then(function ( data ) {
  g.next(data).value.then(function ( data ) {
    g.next(data);
  });
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,348评论 5 22
  • 在此处先列下本篇文章的主要内容 简介 next方法的参数 for...of循环 Generator.prototy...
    醉生夢死阅读 1,464评论 3 8
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,766评论 0 5
  • 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍...
    呼呼哥阅读 1,103评论 0 4
  • 原是今生今世已惘然,山河岁月空惆怅,而我,终将是要等着你的。 一场好酒的前提是,两个人都愿意醉。记忆中最有...
    深秋樱已经荒芜阅读 739评论 0 0