站長資訊網
        最全最豐富的資訊網站

        ES6 Generator 基本使用

        ES6 Generator 基本使用

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

        1.Generator介紹

        先來一段Generator的基礎代碼

        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內部可以使用yield

        • Generator不是函數,而是一個對象,并且在執行開始就進入暫停狀態,而不是直接執行全部操作

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

        2.Generator異步編程

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

        // 這里模擬了一個異步操作 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多次回調顯得比較復雜,代碼也不夠簡潔,generator在異步處理上看似同步的代碼,實際是異步的操作,唯一就是在處理上會相對復雜,如果只進行一次異步操作,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對另一個generator不會進行遍歷,返回的是迭代器對象,而yield*會對generator進行遍歷迭代。

        推薦教程:《JS教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲精品国产成人影院| 500av导航大全精品| 久久久久久亚洲精品成人| 国产成人精品曰本亚洲79ren| 亚洲αv在线精品糸列| 免费人成在线观看欧美精品| 日韩精品在线一区二区| 精品久久久久久无码中文字幕一区| 久久精品国产只有精品66 | 久久无码人妻精品一区二区三区| 精品日产一区二区三区手机| 久久99精品久久久久久久不卡 | 久久精品亚洲男人的天堂| 9久热这里只有精品| 国产精品莉莉欧美自在线线| 国产精品丝袜一区二区三区| 久久发布国产伦子伦精品| 亚洲精品国产精品乱码不99| 亚洲午夜精品久久久久久app| 老司机精品影院91| 精品久久久久久久久久久久久久久| 一级成人精品h| 四虎4hu永久免费国产精品| 国产精品福利一区二区| 国产精品久久久久久吹潮| 精品人妻va出轨中文字幕| 亚洲精品成人无限看| 亚洲精品专区在线观看| 亚洲国产精品国产自在在线| 四虎成人精品在永久在线| 久久亚洲国产精品五月天婷| 九九线精品视频在线观看| 国内精品久久久久久久涩爱| 国产中文在线亚洲精品官网| 国内精品久久久久国产盗摄| 久久夜色精品国产www| 亚洲精品第一国产综合精品99| 亚洲国产精品人人做人人爱| 亚洲动漫精品无码av天堂| 日韩人妻精品一区二区三区视频| 无码人妻精品中文字幕免费 |