generator函數(shù)

之前寫redux-saga的使用時(shí)用到了generator函數(shù),今天我們來(lái)看看generator函數(shù)的簡(jiǎn)單用法.

function *fnc(){
    yield "haha";
    yield "123";
    return "end"
}
const gen = fnc();
console.log(gen.next());
console.log(gen.next());
console.log(gen.next());

先看下輸出結(jié)果


1.png

generator函數(shù)需要一直調(diào)用.next()函數(shù)才能一直執(zhí)行,直到done的值為true,如果我們最后沒(méi)寫return或者只寫了return沒(méi)寫返回值那么最后的結(jié)果會(huì)變成

{ value: 'haha', done: false }
{ value: '123', done: false }
//最后的value值會(huì)變成undefined
{ value: undefined, done: true }

我們可以寫個(gè)遞歸來(lái)調(diào)用它

function *fnc(){
    yield "haha";
    yield "123";
    return "end"
}
const gen = fnc();


function fncNext(){
  const { value, done } = gen.next();
  console.log(value);
  if(!done){
    fncNext();
  }
}
fncNext();

查看結(jié)果


2.png

generator函數(shù)還支持我們傳入?yún)?shù)

function *fnc(){
    let a = yield "haha";
    console.log("a = " +a)
    let b = yield "123";
    console.log("b = " +b)
    return "end"
}
const gen = fnc();
console.log(gen.next())
//傳入了參數(shù)
console.log(gen.next("a"))
//傳入了參數(shù)
console.log(gen.next("b"))

我們光看代碼可能會(huì)覺(jué)得a會(huì)輸出"haha",b會(huì)輸出"123",我們執(zhí)行命令看看結(jié)果


3.png

結(jié)果并不是我們想的那樣而是輸出了我們傳入的參數(shù),這個(gè)是需要注意的.

接下來(lái)看一下配合Promise的使用

function* pf(num) {
  const r1 = yield compute(num);
  yield compute(r1);
}
function compute(num) {
  return new Promise(resolve => {
  setTimeout(() => {
    const ret = num * num;
    console.log(ret)
    resolve(ret);
  }, 1000); });
}

const fn = pf(2);
console.log(fn.next());

查看一下輸出結(jié)果


4.png

可以看到value中是Promise的對(duì)象,所以我們需要這樣執(zhí)行方法

fn.next().value.then(res => fn.next(res))
5.png

我們同樣用遞歸來(lái)實(shí)現(xiàn)他的調(diào)用

function prom(num){
  const { value, done } = fn.next(num);
  if(!done){
    value.then(res => prom(res))
  }
}
prom(2)

一樣可以得到上面的結(jié)果


6.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末降宅,一起剝皮案震驚了整個(gè)濱河市寥茫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲锡,老刑警劉巖后专,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯壶,死亡現(xiàn)場(chǎng)離奇詭異哈蝇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)薪寓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門亡资,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澜共,“玉大人,你說(shuō)我怎么就攤上這事锥腻∴露” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瘦黑,是天一觀的道長(zhǎng)京革。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幸斥,這世上最難降的妖魔是什么匹摇? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮甲葬,結(jié)果婚禮上廊勃,老公的妹妹穿的比我還像新娘。我一直安慰自己经窖,他們只是感情好供搀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钠至,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胎源。 梳的紋絲不亂的頭發(fā)上棉钧,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音涕蚤,去河邊找鬼宪卿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛万栅,可吹牛的內(nèi)容都是我干的佑钾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烦粒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼休溶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扰她,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兽掰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后徒役,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孽尽,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年忧勿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杉女。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻讽。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熏挎,靈堂內(nèi)的尸體忽然破棺而出速勇,到底是詐尸還是另有隱情,我是刑警寧澤婆瓜,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布快集,位于F島的核電站,受9級(jí)特大地震影響廉白,放射性物質(zhì)發(fā)生泄漏个初。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一猴蹂、第九天 我趴在偏房一處隱蔽的房頂上張望院溺。 院中可真熱鬧,春花似錦磅轻、人聲如沸珍逸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谆膳。三九已至,卻和暖如春撮躁,著一層夾襖步出監(jiān)牢的瞬間漱病,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工把曼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杨帽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓嗤军,卻偏偏與公主長(zhǎng)得像注盈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叙赚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359