Javascript 之《如何自動執行生成器》

2021-09-24 06:31:24 字數 1200 閱讀 7097

在 es6 中,引入了乙個新的特性:生成器( generator ),用於控制函式執行流程,可實現對函式執行的中斷與恢復。

乙個簡單的生成器物件定義如下:

function* gen()`;

console.log('bye');

}複製**

那麼如何執行它呢?直接gen()是不行的,我們必須為它例項化乙個迭代器。 你只需要記住:生成器的例項化結果是乙個迭代器,或者迭代器是由生成器例項化而來。

const g = gen();

g.next().value; // hello, hisheng

g.next(); // bye

複製**

通過依次呼叫g.next()來依次執行函式中斷點。

那問題來了,要執行生成器,每次都要例項化並且手動呼叫g.next()多麻煩啊,能不能實現自動執行生成器呢?答案是肯定的。

我們先定義乙個可以無限次迭代的生成器,例如典型的斐波那契函式:

function* fibonacci()

}複製**

因為僅僅是用於演示,我們在生成器內部限制了其呼叫次數,不讓它可無限呼叫,儘管理論上定義乙個無限執行的生成器是沒有問題的。

同時,我寫了乙個可用於自動執行生成器的方法,主要是結合了強大的promise,具體實現見函式注釋:

function

rungenerator(gen)

const g = gen();

if(!g.next)

const next = g.next();

return

newpromise((resolve, reject) => );

function

handler(next)else

}catch (err)

});}}

複製**

執行下看看

rungenerator(fibonacci); // 結果列印出了 1, 1, 2, 3, 5, 8...233

複製**

ok,至此已經達到我們想要的效果了。

關於生成器的使用,最出名的莫過於 大神 tj 專門寫的庫:co,實現更加巧妙。

javascript資料自動轉化

資料型別 變數型別 在c語言中就是 int double,float,long等等。它就是確定在記憶體中佔多少位元組,好方便系統分配。同時也規定你賦值的時候要按規定來,比如 int a 3 指定了資料型別為int 型,你賦值時就只能賦乙個 整數給變數a,而不能隨心所欲。在js中存在著很多強大的功能,...

JavaScript之prototype斷鏈理解

最近在論壇看到一篇帖子關於prototype斷鏈的,原文如下 var sound function person person.prototype sound 早點綁上去 var fo1o new person var person.prototype 遲了綁上去 yyyy yyyy alert f...

javascript之工廠模式

工廠模式,根據不同的引數來產生不同的物件 23中設計模式之一 需求 產生不同的手機物件 var p1 批量的產生物件,根據具體引數來確定屬性 function phone color,size,cpu object型別 obj.color color obj.size size obj.cpu cp...