成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Genrator淺析

NotFound / 1875人閱讀

摘要:通過(guò)可以做到按需獲取。切出的過(guò)程類(lèi)似將一個(gè)值帶出協(xié)程同時(shí)主線(xiàn)程可以在一系列或者操作之后通過(guò)的方法與其通信恢復(fù)協(xié)程執(zhí)行。對(duì)象上部署接口使其具有可遍歷性

生成器的主要功能:通過(guò)一段程序,持續(xù)迭代或枚舉出符合某個(gè)公式或者算法的有序數(shù)列中的元素.

在js中的具體表現(xiàn)形式就是function*。通過(guò)generator可以做到按需獲取。
怎么理解,比如我們想獲取一定數(shù)量的fibonacci,可以通過(guò)下面這種方式;

function * fibo() {
    let a=0;
    let b=1;
    yield a;
    yield b;

    while (true){
        let next = a+b;
        a=b;
        b=next;
        yield  next;
    }
}
let generator=fibo();
for(let i=0;i<10;i++){
    process.stdout.write(generator.next().value+" ");
}
console.log(".")   //0 1 1 2 3 5 8 13 21 34 .

上面比較特殊的一點(diǎn)就是yield,作用與return類(lèi)似,但并非退出函數(shù)體,而是切出函數(shù)運(yùn)行時(shí)。
切出的過(guò)程類(lèi)似將一個(gè)值帶出協(xié)程(coroutine);同時(shí)主線(xiàn)程可以在一系列sync或者async操作之后,通過(guò)generator的next方法與其通信,恢復(fù)協(xié)程執(zhí)行。

隨意創(chuàng)建一個(gè)generator,通過(guò)其原型鏈查看到generator主要有一下幾個(gè)方法

generator.next(value) 獲取下一次生成器切出狀態(tài)(第一次執(zhí)行時(shí)為第一個(gè)切出狀態(tài))

generator.throw(error) 向當(dāng)前生成器返回執(zhí)行對(duì)象拋出錯(cuò)誤,終止生成器運(yùn)行,除非被異常被捕獲

generator[Symbol.iterator] 為生成器提供實(shí)現(xiàn)可迭代的方法(通過(guò)for-of語(yǔ)句可用)

generator.return 返回給定的值,終結(jié)遍歷Generator函數(shù)

其中用的最多用的是第一個(gè)方法。

生成器主要應(yīng)用場(chǎng)景(現(xiàn)階段我感覺(jué)只有下面兩個(gè)用處)

同步化的方式表達(dá)異步操作,解決金字塔回調(diào)問(wèn)題。

before like this

        //normal version
        function echo(content,cb) {
            cb(null,content);
        }
        function run() {
            echo("hello", (...rest0) => {
                 console.log(rest0[1]+" world");
            });
        }
        run();  //hello world

generator equivalent writing

//thunk version
function echo(content) {
    return cb => {
        cb(null,content);  //generator作為logic主體,主線(xiàn)程執(zhí)行異步方法
    }
}
function run(genFn) {
    const gen=genFn();
    const next= value =>{
        const ret=gen.next(value);
        if(ret.done)return;
        ret.value((err,val) => {  //async tasks
            if(err) return console.error(err);
            next(val);  //recursion
        });

    }
    next();
}
run(function* () {
    const msg0= yield  echo("hello");
    const msg1= yield  echo(`${msg0} world`);
    console.log(msg1); //hello world
});

說(shuō)明 我上面這種寫(xiě)法雖然簡(jiǎn)單,但是很多變種庫(kù)都有其影子,例如co,koa1 and so on。

對(duì)象上部署Iterator接口,使其具有可遍歷性

function* setIterator(obj) {
     let keys = Object.keys(obj);
     for (let i=0,len=keys.length; i < len; i++) {
       let key = keys[i];
       yield [key, obj[key]];
     }
   }

   let obj = { name: "gcy", age: "infinity" };

   for (let [key, value] of setIterator(obj)) {
     console.log(key, value);
   }

// name gcy
// age infinity

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

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

相關(guān)文章

  • 用Promise、Generator、Async函數(shù)將異步操作同步化

    摘要:函數(shù)最簡(jiǎn)單,不需要借助其他的執(zhí)行器即可按照順序執(zhí)行。函數(shù)執(zhí)行過(guò)程中遇到就會(huì)交出執(zhí)行權(quán)限,等到異步操作完成再進(jìn)行下面的操作,語(yǔ)句返回的是方法的參數(shù)。小程序不支持函數(shù),并且同時(shí)間最多支持個(gè)請(qǐng)求,所以被迫無(wú)奈,只能使用來(lái)做異步批量調(diào)用。 在日常開(kāi)發(fā)的過(guò)程中總會(huì)遇到一些下一個(gè)請(qǐng)求需要上一個(gè)請(qǐng)求的響應(yīng)數(shù)據(jù)作為參數(shù)(或者坑爹的小程序開(kāi)發(fā)只能同時(shí)最多請(qǐng)求5個(gè)),那么這個(gè)時(shí)候我們就需要批量地請(qǐng)求一批后...

    jaysun 評(píng)論0 收藏0
  • 淺析微信支付:支付驗(yàn)收示例和驗(yàn)收指引

    摘要:本文是淺析微信支付系列文章的第十一篇,主要講解支付驗(yàn)收示例和驗(yàn)收指引。為保證商戶(hù)接入質(zhì)量,提升交易安全及用戶(hù)體驗(yàn),微信支付的合作服務(wù)商在正式上線(xiàn)交易前,必須先根據(jù)本文指引完成驗(yàn)收。 本文是【淺析微信支付】系列文章的第十一篇,主要講解支付驗(yàn)收示例和驗(yàn)收指引。 淺析微信支付系列已經(jīng)更新十一篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下。 淺析微信支付:如何使用沙箱環(huán)境測(cè)試 淺析微信支付:下載對(duì)賬單...

    Cympros 評(píng)論0 收藏0
  • 淺析微信支付:如何使用沙箱環(huán)境測(cè)試

    摘要:本文是淺析微信支付系列文章的第十篇,主要講解如何使用沙箱環(huán)境來(lái)測(cè)試微信支付。圖為微信支付仿真測(cè)試系統(tǒng)后簡(jiǎn)稱(chēng)仿真系統(tǒng)的簡(jiǎn)化原理圖。沙箱說(shuō)明微信支付沙箱環(huán)境,是提供給微信支付商戶(hù)的開(kāi)發(fā)者,用于模擬支付及回調(diào)通知。 本文是【淺析微信支付】系列文章的第十篇,主要講解如何使用沙箱環(huán)境來(lái)測(cè)試微信支付。 淺析微信支付系列已經(jīng)更新十篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下。 淺析微信支付:下載對(duì)賬單和資...

    騫諱護(hù) 評(píng)論0 收藏0
  • 淺析微信支付:查詢(xún)訂單和關(guān)閉訂單

    摘要:本文是淺析微信支付系列文章的第七篇,主要講解微信商戶(hù)平臺(tái)的訂單查詢(xún)和關(guān)閉接口的使用。查詢(xún)訂單以下為微信官方的查詢(xún)訂單文檔應(yīng)用場(chǎng)景該接口提供所有微信支付訂單的查詢(xún),商戶(hù)可以通過(guò)查詢(xún)訂單接口主動(dòng)查詢(xún)訂單狀態(tài),完成下一步的業(yè)務(wù)邏輯。 本文是【淺析微信支付】系列文章的第七篇,主要講解微信商戶(hù)平臺(tái)的訂單查詢(xún)和關(guān)閉接口的使用。 淺析微信支付系列已經(jīng)更新六篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下哦。 ...

    Dean 評(píng)論0 收藏0
  • 淺析微信支付:微信公眾號(hào)網(wǎng)頁(yè)授權(quán)

    摘要:淺析微信支付微信公眾號(hào)網(wǎng)頁(yè)授權(quán)本文是淺析微信支付系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁(yè)授權(quán)及用戶(hù)信息獲取。淺析微信支付系列已經(jīng)更新三篇了喲,沒(méi)有看過(guò)的朋友們可以看一下哦。 淺析微信支付:微信公眾號(hào)網(wǎng)頁(yè)授權(quán) 本文是【淺析微信支付】系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁(yè)授權(quán)及用戶(hù)信息獲取。 淺析微信支付系列已經(jīng)更新三篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下哦。 淺...

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

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

0條評(píng)論

閱讀需要支付1元查看
<