站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        ES6 Generator 基本使用

        ES6 Generator 基本使用

        本文實(shí)例講述了ES6 Generator基本使用方法。分享給大家供大家參考,具體如下:

        1.Generator介紹

        先來一段Generator的基礎(chǔ)代碼

        function* g(){  yield 100;  yield 200;  return 300; } let gg = g(); console.log(gg);            // Object [Generator] {} console.log(gg.next());        // { value: 100, done: false } console.log(gg.next());        // { value: 200, done: false } console.log(gg.next());        // { value: 300, done: true } console.log(gg.next());        // { value: undefined, done: true }

        首先我們看到:

        • Generator是由functinon*定義的,在generator內(nèi)部可以使用yield

        • Generator不是函數(shù),而是一個(gè)對(duì)象,并且在執(zhí)行開始就進(jìn)入暫停狀態(tài),而不是直接執(zhí)行全部操作

        • 通過next()來執(zhí)行下一步操作,返回的都是{ value: xxx, done: xxx }這樣的形式,value代表上一次操作返回的值,done有兩個(gè)值,一個(gè)是true,一個(gè)是false,表示整個(gè)流程是否全部結(jié)束。

        2.Generator異步編程

        generator是ES6中引入的異步解決方案,我們來看看它與promise處理異步的對(duì)比,來看它們的差異。

        // 這里模擬了一個(gè)異步操作 function asyncFunc(data) {  return new Promise( resolve => {   setTimeout(    function() {     resolve(data)    },1000   )  }) }

        promise的處理方式:

        asyncFunc("abc").then( res => {  console.log(res);                    // "abc"  return asyncFunc("def") }).then( res => {  console.log(res);                    // "def"  return asyncFunc("ghi") }).then( res => {  console.log(res);                    // "ghi" })

        generator的處理方式:

        function* g() {  const r1 = yield asyncFunc("abc");  console.log(r1);                            // "abc"  const r2 = yield asyncFunc("def");  console.log(r2);                            // "def"  const r3 = yield asyncFunc("ghi");  console.log(r3);                            // "ghi" }  let gg = g(); let r1 = gg.next(); r1.value.then(res => {  let r2 = gg.next(res);  r2.value.then(res => {   let r3 = gg.next(res);   r3.value.then(res => {    gg.next(res)   })  }) })

        promise多次回調(diào)顯得比較復(fù)雜,代碼也不夠簡潔,generator在異步處理上看似同步的代碼,實(shí)際是異步的操作,唯一就是在處理上會(huì)相對(duì)復(fù)雜,如果只進(jìn)行一次異步操作,generator更合適。

        3.yield和yield*

        先來看兩段代碼

        function* g1() {  yield 100;  yield g2();  return 400; }  function* g2() {  yield 200;  yield 300; }  let gg = g1(); console.log(gg.next());                // { value: 100, done: false } console.log(gg.next());                // { value: Object [Generator] {}, done: false } console.log(gg.next());                // { value: 400, done: true } console.log(gg.next());                // { value: undefined, done: true }
        function* g1() {  yield 100;  yield* g2();  return 400; }  function* g2() {  yield 200;  yield 300; }  let gg = g1(); console.log(gg.next());                // { value: 100, done: false } console.log(gg.next());                // { value: 200, done: false } console.log(gg.next());                // { value: 300, done: false } console.log(gg.next());                // { value: 400, done: true }

        yield對(duì)另一個(gè)generator不會(huì)進(jìn)行遍歷,返回的是迭代器對(duì)象,而yield*會(huì)對(duì)generator進(jìn)行遍歷迭代。

        推薦教程:《JS教程》

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 91精品国产福利在线观看| 天天爽夜夜爽精品视频app| 成人国内精品久久久久影院| 国产欧美一区二区精品性色99| 精品久久人妻av中文字幕| 免费精品久久久久久中文字幕 | 一本色道久久88—综合亚洲精品| 99国产精品国产免费观看| 国产99精品久久| 精品一区二区三区免费毛片爱| 亚洲AV无码之日韩精品| 国产欧美精品区一区二区三区| 欧美大片日韩精品| 99久久99久久久精品齐齐| 蜜国产精品jk白丝AV网站| 亚洲精品视频免费观看| 亚洲电影日韩精品| 久久久久国产精品麻豆AR影院| 国产精品粉嫩美女在线观看| 91久久精品电影| 亚洲国产成人久久精品影视| 精品久久久久久中文字幕| 国产精品成人观看视频免费 | 丁香色婷婷国产精品视频| 久久成人影院精品777| 国产成人精品高清在线观看99| 国产精品无套内射迪丽热巴| 亚洲日本精品一区二区| 国产99视频精品免视看7| 亚洲精品午夜无码电影网| 亚洲精品无码专区在线播放| 欧美日韩精品系列一区二区三区| 精品亚洲欧美中文字幕在线看| 国产在线精品福利大全| 国产内地精品毛片视频| 国产精品自在在线午夜福利| 国产精品免费久久久久久久久| 国产精品亚洲精品日韩已方| 黑人巨茎精品欧美一区二区| 精品欧美激情在线看| 四虎永久在线精品免费一区二区|