ES6 Generator 函數(shù)

  • Generator 函數(shù)是一種異步編程的解決方案,使異步編程看起來(lái)更像同步

  • Generator 函數(shù)形式:function* fun() + yield 表達(dá)式。

  • 結(jié)合Co模塊使用的Generator函數(shù),yield表達(dá)式后面只能跟:function, promise, generator, array, or object

const co       = require('co');
const readFile = require('fs-readfile-promise');
const fs       = require('fs');
/**
 * 1、普通 Generator模式
 */
function *a() {
    let pb = yield {name : 'zhangsan'};         //Generator函數(shù)執(zhí)行到這里就停下了,不會(huì)再往下執(zhí)行。
    console.log('我在Generator函數(shù)內(nèi)---%j',pb);  //這里是取不到pb的。這類似于nodejs 的普通異步函數(shù)。
    //throw new Error('報(bào)錯(cuò)啦');
}
const b = a();
console.log('b--%j',b);  //b--{}
const c = b.next();
console.log('c--%j',c);  //c--{"value":{"name":"zhangsan"},"done":false}
const d = b.next();
console.log('d--%j',d);  //打印1、我在Generator函數(shù)內(nèi)---undefined    打印2、d--{"done":true}
  
/**
 * 如果我們把第一個(gè)next()中 yield后的值傳遞給 第二個(gè)next(),那么我們就可以拿到pb了。
 * 當(dāng)然這種操作我們可以通過(guò) Co模塊來(lái)幫我們實(shí)現(xiàn)。
 */
//const d = b.next(c.value);   
//console.log('d-----%j',d);  // 打印1、我在Generator函數(shù)內(nèi)---{"name":"zhangsan"}   打印2、d-----{"done":true}
  
/**
 *  2、結(jié)合:Co 模塊
 *  注意:結(jié)合Co模塊使用的時(shí)候:yield 后面只能跟:function, promise, generator, array, or object
 */
 
/**
 * 非Promise---偽同步模式
 */
/*function *a() {
    try{
        let pb = yield {name : 'zhangsan'};
        //let pb = yield 1;     //這樣是會(huì)報(bào)錯(cuò)的
        console.log(pb);
        throw new Error('報(bào)錯(cuò)啦');
    }catch (e){
        console.log(e);
    }
}
co(a);*/
  
/**
 * Promise 模式:
 * 因?yàn)閏o包裝Generator函數(shù),并返回一個(gè)Promise對(duì)象,所以可以使用 傳統(tǒng)Promise方式來(lái)處理
 * @returns {*}
 */
 
/*function *a() {
    let pb = yield {name : 'zhangsan'};
    throw new Error('報(bào)錯(cuò)啦');
    //return pb;
}
co(a).then(function (data) {
    console.log('收到參數(shù):',data);
}).catch(function (err) {
    console.log(err);
});*/

#### 示例:異步讀取文件
/**
 * 異步讀取文件內(nèi)容
 */
function *getFileContent() {
    try{
        // let pb = yield readFile('./doc.txt'); //使用第三方的 fs-readfile-promise 包
        let pb = yield readFiles();             //使用手動(dòng)包裝成Promise的fs
        console.log(pb.toString());
    }catch (e){
        console.log(e);
    }
}
co(getFileContent);

/**
 * 一個(gè)返回Promise的函數(shù)
 * @returns {Promise}
 */
function readFiles() {
    return new Promise(function (reso,rej) {
        fs.readFile('./doc.txt',function (err,data) {
            reso(data);
        })
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 本文作者就是我,簡(jiǎn)書(shū)的microkof。如果您覺(jué)得本文對(duì)您的工作有意義,產(chǎn)生了不可估量的價(jià)值,那么請(qǐng)您不吝打賞我,...
    microkof閱讀 23,774評(píng)論 16 78
  • 在此處先列下本篇文章的主要內(nèi)容 簡(jiǎn)介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢(mèng)死閱讀 1,463評(píng)論 3 8
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,399評(píng)論 9 19
  • 異步編程對(duì)JavaScript語(yǔ)言太重要。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,334評(píng)論 5 22
  • 簡(jiǎn)介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。本章詳細(xì)介紹...
    呼呼哥閱讀 1,090評(píng)論 0 4