国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6中Generator

zhunjiee / 916人閱讀

摘要:道理大概就是,有兩個(gè)異步程序,用小明和小紅指代它們。小紅需要等小明執(zhí)行完了才可以被執(zhí)行,那么我們?cè)趫?zhí)行到小明時(shí),暫停程序的運(yùn)行通過,等到小明有了返回結(jié)果時(shí),再執(zhí)行后面跟著的小紅。在最新的中,已經(jīng)拋棄了,轉(zhuǎn)而使用。

ES6中Generator

Generator是ES6一個(gè)很有意思的特性,也是不容易理解的特性。不同于let/const提供了塊級(jí)作用域這樣明顯的目的,這玩意兒被搞出來到底是干嘛的?

首先我們需要明確一個(gè)問題,在JavaScript中,任何一個(gè)函數(shù)只要開始執(zhí)行,便無法停止下來直到執(zhí)行完成(別跟我提debug,你見過哪個(gè)用戶在使用產(chǎn)品的還得開個(gè)debug調(diào)試你的代碼)。

but,Generator提供這種能力。 看下面代碼:

function *g(){
    console.log("start");
    yield 1;
    console.log("middle");
    yield 2;
    console.log("end");
}
var g1 = g();
console.log(g1.next()); 
// start
// {value: 1, done: false}
console.log(g1.next());  
// middle
// {value: 2, done: false}
console.log(g1.next());  
// end
// {value: undefined, done: true}

根據(jù)輸出結(jié)果,我們看到,在函數(shù)g中,碰到yield關(guān)鍵詞,運(yùn)行的程序會(huì)停下來。只有調(diào)用 next()方法,才會(huì)繼續(xù)執(zhí)行函數(shù)g中的代碼。所以函數(shù)g本身有暫停狀態(tài)

至此,我們需要知道:

Generator不是函數(shù),不是函數(shù),不是函數(shù);

g()不會(huì)立即出發(fā)執(zhí)行,而是一上來就暫停,并返回一個(gè)Iterator對(duì)象;

每次g1.next()都會(huì)打破暫停狀態(tài)去執(zhí)行,直到遇到下一個(gè)yield或者return

遇到y(tǒng)ield時(shí),會(huì)執(zhí)行yeild后面的表達(dá)式,并返回執(zhí)行之后的值,然后再次進(jìn)入暫停狀態(tài),此時(shí)done: false。

遇到return時(shí),會(huì)返回值,執(zhí)行結(jié)束,即done: true

每次g.next()的返回值永遠(yuǎn)都是{value: ... , done: ...}的形式

Generator與異步

既然Generator可以函數(shù)停下來,有些腦洞清奇的人,想到了可不可以用Generator處理異步程序。

先看一個(gè)傳統(tǒng)例子:

    function asyn(fn) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                fn();
                resolve(true);
            }, 1000);
        });
    }

    function main() {
        console.log("start");
        asyn(function(d) {
            console.log("async one");
            asyn(function(d) {
                console.log("async two");
                console.log("end");
            });
        });
    }

    main();

再來看看使用了Generator的異步程序:

    function asyn(fn) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                fn();
                resolve(true);
            }, 1000);
        });
    }

    co(function*() {
        console.log("start");
        yield asyn(function(d) {
            console.log("async one");
        });

        yield asyn(function(d) {
            console.log("async two");
        });
        console.log("end");
    });

    function co(fn) {

        return new Promise((resolve,reject)=>{
            let g = fn();

            onFullfilled();
            function onFullfilled() {
                let ret = null;
                ret = g.next();
                next(ret);
            }

            function next(ret) {
                if(ret.done) return resolve(ret.value);
                ret.value.then(onFullfilled);
            }
        } );
    }

函數(shù)在異步程序沒有采用嵌套回調(diào),是直接用同步的方式寫了出來。道理大概就是,有兩個(gè)異步程序,用小明和小紅指代它們。小紅需要等小明執(zhí)行完了才可以被執(zhí)行,那么我們?cè)趫?zhí)行到小明時(shí),暫停程序的運(yùn)行(通過yield),等到小明有了返回結(jié)果時(shí),再執(zhí)行后面跟著的小紅(next())。

在上面的程序中,我們添加了一個(gè)co函數(shù),這個(gè)函數(shù)的作用是讓Generator自動(dòng)執(zhí)行下去。直白來說,就是當(dāng)?shù)谝粋€(gè)異步函數(shù)返回后,自動(dòng)調(diào)用next()方法運(yùn)行后面的代碼。

Generator與Koa

Koa是基于Node.js的Web應(yīng)用框架。在Koa中,處理的異步程序主要是網(wǎng)絡(luò)請(qǐng)求(HTTP)、文件讀取和數(shù)據(jù)查詢。這里面的異步場景較多,如果再加上程序分層,采用傳統(tǒng)的callback方式,那回調(diào)多了去了。

app.on("get", function(){
    auth(function(){
        router(function(){
            find(function(){
                save(function(){
                    render(function(){
                        //......
                    })
                })
            })
        })
    })

})

這樣寫法對(duì)于程序維護(hù)及其不利,毫無便捷性可言。在有了generator后,我們便可以像上面那種方式來寫程序。Koa最初的版本就是通過這種方式,讓中間處理程序都轉(zhuǎn)成一個(gè)個(gè)"yield"(中間件)。通過中間件的形式去處理客戶端請(qǐng)求,讓開發(fā)App應(yīng)用更加靈活,不受框架自身限制。

在最新的Koa2中,已經(jīng)拋棄了Genetator,轉(zhuǎn)而使用async/await

但是無論采用哪種方式,其本質(zhì)都是利用了Promise。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/98413.html

相關(guān)文章

  • ES6學(xué)習(xí)筆記之Generator函數(shù)

    摘要:調(diào)用函數(shù)后和普通函數(shù)不同的是,該函數(shù)并不立即執(zhí)行,也不返回函數(shù)執(zhí)行結(jié)果,而是返回一個(gè)指向內(nèi)部狀態(tài)的對(duì)象,也可以看作是一個(gè)遍歷器對(duì)象。第一個(gè)只是用來啟動(dòng)函數(shù)內(nèi)部的遍歷器,傳參也沒有多大意義。 之前斷斷續(xù)續(xù)接觸到了一些ES6的知識(shí),異步編程方面聽得比較多的就是Promise,直到最近比較系統(tǒng)地學(xué)習(xí)了ES6的新特性才發(fā)現(xiàn)Generator這個(gè)神奇的存在,它可以實(shí)現(xiàn)一些前所未有的事情,讓我頓時(shí)...

    cjie 評(píng)論0 收藏0
  • 深入理解 Generator 函數(shù)

    摘要:同時(shí),迭代器有一個(gè)方法來向函數(shù)中暫停處拋出一個(gè)錯(cuò)誤,該錯(cuò)誤依然可以通過函數(shù)內(nèi)部的模塊進(jìn)行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個(gè)人能力有限,翻譯中難免有紕漏和錯(cuò)誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...

    jzzlee 評(píng)論0 收藏0
  • 關(guān)于協(xié)程和 ES6 Generator

    摘要:關(guān)于協(xié)程和中的什么是協(xié)程進(jìn)程和線程眾所周知,進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是工作時(shí)間段的描述,不過是顆粒大小不同,進(jìn)程是資源分配的最小單位,線程是調(diào)度的最小單位。子程序就是協(xié)程的一種特例。 關(guān)于協(xié)程和 ES6 中的 Generator 什么是協(xié)程? 進(jìn)程和線程 眾所周知,進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述,不過是顆粒大小不同,進(jìn)程是 CPU 資源分配的最小單位,...

    RyanHoo 評(píng)論0 收藏0
  • 【W(wǎng)eb全棧課程三】ES6特性介紹(下)

    摘要:示例運(yùn)行函數(shù)彈出彈出函數(shù)接收參數(shù),返回值。其中,返回一個(gè)對(duì)象,是的返回值,代表函數(shù)是否執(zhí)行完成。 ES6特性介紹(下) ES6新的標(biāo)準(zhǔn),新的語法特征:1、變量/賦值2、函數(shù)3、數(shù)組/json4、字符串5、面向?qū)ο?、Promise7、generator8、ES7:async/await 《【W(wǎng)eb全棧課程二】ES6特性介紹(上)》見:https://segmentfault.com/a...

    wangshijun 評(píng)論0 收藏0
  • ES6 系列之 Babel 將 Generator 編譯成了什么樣子

    摘要:前言本文就是簡單介紹下語法編譯后的代碼。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤剑?qǐng)務(wù)必給予指正,十分感謝。如果喜歡或者有所啟發(fā),歡迎,對(duì)作者也是一種鼓勵(lì)。 前言 本文就是簡單介紹下 Generator 語法編譯后的代碼。 Generator function* helloWorldGenerator() { yield hello; yield world; return ending...

    EddieChan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

zhunjiee

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<