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,333評論 5 22
  • 在此處先列下本篇文章的主要內容 簡介 next方法的參數 for...of循環 Generator.prototy...
    醉生夢死閱讀 1,463評論 3 8
  • 弄懂js異步 講異步之前,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,749評論 0 5
  • 簡介 基本概念 Generator函數是ES6提供的一種異步編程解決方案,語法行為與傳統函數完全不同。本章詳細介紹...
    呼呼哥閱讀 1,090評論 0 4
  • 原是今生今世已惘然,山河歲月空惆悵,而我,終將是要等著你的。 一場好酒的前提是,兩個人都愿意醉。記憶中最有...
    深秋櫻已經荒蕪閱讀 728評論 0 0