ES6的Generator函數(shù)(2018-06-21)

聲明Generator函數(shù)

?????Generator函數(shù),又稱生成器函數(shù),是ES6的一個重要的新特性。

    //聲明一個Hello的Generator函數(shù)
    function* Hello(name) {
        yield `hello ${name}`;
        yield `how are you`;
        yield `bye`;
    }

?????注意:
1玷禽、普通函數(shù)用function來聲明赫段,Generator函數(shù)用function*聲明。
2矢赁、Generator函數(shù)內(nèi)部有新的關鍵字:yield糯笙,普通函數(shù)沒有。

調(diào)用Generator函數(shù)
    //聲明一個Hello的Generator函數(shù)
    function* Hello(name) {
        yield `hello ${name}`;
        yield `how are you`;
        yield `bye`;
    }

    //調(diào)用Hello函數(shù)
    let ite = Hello('王德發(fā)');
    //結(jié)果:[object Generator]

    ite.next();
    //{value: "hello 王德發(fā)", done: false}

    ite.next();
    //{value: "how are you", done: false}

    ite.next();
    //{value: "bye", done: false}

    ite.next();
    //{value: undefined, done: true}

?????函數(shù)執(zhí)行后撩银,返回了一個:[object Genrator]生成器對象给涕,我們把它賦值到變量ite中,僅此而已蜒蕾,并沒有做太多的事情稠炬。
?????第1次調(diào)用生成器對象ite的next( )方法焕阿,返回了一個對象:

    {value: "hello 王德發(fā)", done: false}

?????第2次調(diào)用生成器對象ite的next( )方法咪啡,同樣得到了一個對象:

   {value: "how are you", done: false}

?????第3次調(diào)用生成器對象ite的next( )方法,又得到了一個對象:

    {value: "bye", done: false}

?????第4次調(diào)用生成器對象ite的next( )方法暮屡,返回的對象:

    {value: undefined, done: true}
Generator函數(shù)的行為

?????Generator函數(shù)被調(diào)用后并不會一直執(zhí)行到最后撤摸,它是先回返回一個生成器對象,然后hold住不動褒纲,等到生成器對象的next( )方法被調(diào)用后准夷,函數(shù)才會繼續(xù)執(zhí)行,直到遇到關鍵字yield后莺掠,又會停止執(zhí)行衫嵌,并返回一個Object對象,然后繼續(xù)等待彻秆,直到next( )再一次被調(diào)用的時候楔绞,才會繼續(xù)接著往下執(zhí)行,直到done的值為true唇兑。

yield語句的作用

?????而yield在這里起到了十分重要的作用酒朵,就相當于暫停執(zhí)行并且返回信息。有點像傳統(tǒng)函數(shù)的return的作用扎附,但不同的是普通函數(shù)只能return一次蔫耽,但是Generator函數(shù)可以有很多個yield。而return代表的是終止執(zhí)行留夜,yield代表的是暫停執(zhí)行匙铡,后續(xù)通過調(diào)用生成器的next( )方法,可以恢復執(zhí)行碍粥。

next( )方法接收參數(shù)

?????next( )方法還可以接受一個參數(shù)鳖眼,它的參數(shù)會作為上一個yield的返回值,我們來看一下:

    //聲明一個Hello的Generator函數(shù)
    function* Hello() {
        let res = yield `hello`;
        yield res;
    }
    
    let iterator = Hello();
    //結(jié)果:一個生成器對象

    iterator.next();
    //結(jié)果:{value: "hello", done: false}

    iterator.next("王德發(fā)");
    //結(jié)果:{value: "王德發(fā)", done: false}

?????注意函數(shù)體內(nèi)的第一個yield關鍵字即纲,我們把它的返回值賦值給了一個變量res具帮。
?????再看2次next方法的調(diào)用:
?????第1次調(diào)用next( )方法博肋,返回的對象屬性value值為“hello”,屬性done值為:fasle蜂厅,并暫停執(zhí)行匪凡。
?????第2次next( )方法,傳入?yún)?shù):字符串“王德發(fā)”掘猿。此時病游,第二個yield關鍵字緊跟著的是變量res,而變量res的值正是上一個關鍵字yield的返回值稠通。也就是說這個值正是我們傳入的參數(shù):“王德發(fā)”衬衬。因為:next( )的參數(shù)會作為上一個yield的返回值。

關鍵字yield*

?????在一個Generator函數(shù)里面改橘,如果我們想調(diào)用另一個Generator函數(shù)滋尉,就需要用到的關鍵字是:yield*。

    //聲明Generator函數(shù):gen1   
    function* gen1() {
        yield "gen1 start";
        yield "gen1 end";
    }

    //聲明Generator函數(shù):gen2
    function* gen2() {
        yield "gen2 start";
        yield "gen2 end";
    }

    //聲明Generator函數(shù):start
    function* start() {
        yield "start";
        yield* gen1();
        yield* gen2();
        yield "end";
    }

    //調(diào)用start函數(shù)
    var ite = start();
    //創(chuàng)建一個生成器
    
    ite.next();
    //{value: "start", done: false}

    ite.next();
    //{value: "gen1 start", done: false}

    ite.next();
    //{value: "gen1 end", done: false}

    ite.next();
    //{value: "gen2 start", done: false}

    ite.next();
    //{value: "gen2 end", done: false}

    ite.next();
    //{value: "end", done: false}

?????我們主要看start( )這個Generator函數(shù)飞主,其中有兩句代碼:

    yield* gen1();
    yield* gen2();

????? 如果一個Generator函數(shù)A執(zhí)行過程中狮惜,進入(調(diào)用)了另一個Generator函數(shù)B,那么會一直等到Generator函數(shù)B全部執(zhí)行完畢后碌识,才會返回Generator函數(shù)A繼續(xù)執(zhí)行碾篡。

Generator函數(shù)的用途

????? 它可以控制函數(shù)的內(nèi)部狀態(tài),依次遍歷每個狀態(tài)筏餐;可以根據(jù)需要开泽,輕松地讓函數(shù)暫停執(zhí)行或者繼續(xù)執(zhí)行。利用Generator函數(shù)暫停執(zhí)行的作用魁瞪,可以將異步操作的語句寫到y(tǒng)ield后面穆律,通過執(zhí)行next方法進行回調(diào)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佩番,一起剝皮案震驚了整個濱河市众旗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟畏,老刑警劉巖贡歧,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赋秀,居然都是意外死亡利朵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門猎莲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绍弟,“玉大人,你說我怎么就攤上這事著洼≌燎玻” “怎么了而叼?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豹悬。 經(jīng)常有香客問我葵陵,道長,這世上最難降的妖魔是什么瞻佛? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任脱篙,我火速辦了婚禮,結(jié)果婚禮上伤柄,老公的妹妹穿的比我還像新娘绊困。我一直安慰自己,他們只是感情好适刀,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布秤朗。 她就那樣靜靜地躺著,像睡著了一般蔗彤。 火紅的嫁衣襯著肌膚如雪川梅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天然遏,我揣著相機與錄音,去河邊找鬼吧彪。 笑死待侵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的姨裸。 我是一名探鬼主播秧倾,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傀缩!你這毒婦竟也來了那先?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤赡艰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召廷,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡句灌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了料身。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汤纸。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芹血,靈堂內(nèi)的尸體忽然破棺而出贮泞,到底是詐尸還是另有隱情楞慈,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布啃擦,位于F島的核電站抖部,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏议惰。R本人自食惡果不足惜慎颗,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望言询。 院中可真熱鬧俯萎,春花似錦、人聲如沸运杭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辆憔。三九已至撇眯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虱咧,已是汗流浹背熊榛。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腕巡,地道東北人玄坦。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像绘沉,于是被迫代替她去往敵國和親煎楣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 在此處先列下本篇文章的主要內(nèi)容 簡介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢死閱讀 1,440評論 3 8
  • 本文作者就是我车伞,簡書的microkof择懂。如果您覺得本文對您的工作有意義,產(chǎn)生了不可估量的價值另玖,那么請您不吝打賞我困曙,...
    microkof閱讀 23,730評論 16 78
  • 1.基本概念 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同日矫。本章詳細...
    lhdoeo閱讀 353評論 0 1
  • 簡介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案赂弓,語法行為與傳統(tǒng)函數(shù)完全不同。本章詳細介紹...
    呼呼哥閱讀 1,075評論 0 4
  • 同步應用 簡介 基本概念 Generator函數(shù)式ES6提供的一種異步編程解決方案,語法行為和傳統(tǒng)函數(shù)完全不同.語...
    JarvanZ閱讀 1,193評論 0 1