Generator函數(shù)的概念 -> yield 關(guān)鍵字的解析 -> async 函數(shù)(async,await)

參考鏈接:http://www.ruanyifeng.com/blog/2015/04/generator.html 阮一峰先生的一篇日志

function* gen(x){
          var y = yield x + 2;
          return y;
        }
        var g = gen(1);
        g.next() // { value: 3, done: false }
        g.next() // { value: undefined, done: true} 

上面代碼中隘谣,調(diào)用 Generator 函數(shù),會返回一個內(nèi)部指針(即遍歷器)g 篷扩。這是 Generator 函數(shù)不同于普通函數(shù)的另一個地方稠氮,即執(zhí)行它不會返回結(jié)果曹阔,返回的是指針對象。調(diào)用指針 g 的 next 方法隔披,會移動內(nèi)部指針(即執(zhí)行異步任務(wù)的第一段)赃份,指向第一個遇到的 yield 語句,上例是執(zhí)行到 x + 2 為止锹锰。
換言之芥炭,next 方法的作用是分階段執(zhí)行 Generator 函數(shù)。每次調(diào)用 next 方法恃慧,會返回一個對象园蝠,表示當(dāng)前階段的信息( value 屬性和 done 屬性)。value 屬性是 yield 語句后面表達(dá)式的值痢士,表示當(dāng)前階段的值彪薛;done 屬性是一個布爾值,表示 Generator 函數(shù)是否執(zhí)行完畢怠蹂,即是否還有下一個階段善延。

http://www.html-js.com/article/1711 yield 原理篇

如下示例代碼,在瀏覽器中打斷點(diǎn)可以一窺 yield 執(zhí)行方法

function* fib2(){
yield 0;//狀態(tài)0城侧,第一次調(diào)用next易遣,返回0,并改變狀態(tài)
yield 1;//狀態(tài)1嫌佑,第二次調(diào)用next豆茫,返回1,并改變狀態(tài)
var p1 = 0
    ,p2 =1
    ,cur = p1+p2;
while(true){
    yield cur;//狀態(tài)2屋摇,后面調(diào)用next揩魂,返回相應(yīng)的幾個,狀態(tài)不在改變
    p1 = p2;
    p2 = cur;
    cur = p1+p2;
}
}
var fibIter2 = fib2();
for(var i =0;i<8;i++){
    console.log(fibIter2.next().value);
} 

進(jìn)階示例
示例1:

function* gen(x){
          var y = yield x + 2;
          return y;
        }
        var g = gen(1);
        console.log(g.next()) // { value: 3, done: false }
        console.log(g.next()) //{ value: undefined, done: true}
        console.log(g.next()) // { value: undefined, done: true}

示例2:

//Iterator 遍歷
//Generator(生成器)是ES6標(biāo)準(zhǔn)引入的新的數(shù)據(jù)類型炮温。一個generator看上去像一個函數(shù)火脉,但可以返回多次
//1.類似于將異步變成同步,使函數(shù)可以按順序依次執(zhí)行,用的已經(jīng)不多了倦挂,有新的東西替代了

let xiaochuan = function*(){
yield "冰淇淋";
yield "漢堡";
}
// console.log(xiaochuan().next());//Object {value: "冰淇淋", done: false}
const result =  xiaochuan();
console.log(result.next());//Object {value: "冰淇淋", done: false}
console.log(result.next());//Object {value: "漢堡", done: false}
console.log(result.next());//Object {value: undefined, done: true}

總結(jié):yield 執(zhí)機(jī)制是這樣的:yield 返回的是一個指針對象 .next() 執(zhí)行 -> 發(fā)現(xiàn) yeild 語句執(zhí)行后返回畸颅,返回的值便是當(dāng)時這個階段 后面表達(dá)式的值,直到執(zhí)行完畢 done:true 為止妒峦。

擴(kuò)展出如下的示例:

http://www.ruanyifeng.com/blog/2015/05/async.html async 函數(shù)的含義和用法(阮一峰先生的日志)

前文有一個 Generator 函數(shù)重斑,依次讀取兩個文件兵睛。

var fs = require('fs');
var readFile = function (fileName){
    return new Promise(function (resolve, reject){
      fs.readFile(fileName, function(error, data){
      if (error) reject(error);
      resolve(data);
    });
  });
};
var gen = function* (){
  var f1 = yield readFile('/etc/fstab');
  var f2 = yield readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

寫成 async 函數(shù)肯骇,就是下面這樣。

var asyncReadFile = async function (){
  var f1 = await readFile('/etc/fstab');
  var f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祖很,一起剝皮案震驚了整個濱河市笛丙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌假颇,老刑警劉巖胚鸯,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笨鸡,居然都是意外死亡姜钳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門形耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哥桥,“玉大人,你說我怎么就攤上這事激涤∧飧猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵倦踢,是天一觀的道長送滞。 經(jīng)常有香客問我,道長辱挥,這世上最難降的妖魔是什么犁嗅? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晤碘,結(jié)果婚禮上褂微,老公的妹妹穿的比我還像新娘。我一直安慰自己哼蛆,他們只是感情好蕊梧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腮介,像睡著了一般肥矢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天甘改,我揣著相機(jī)與錄音旅东,去河邊找鬼。 笑死十艾,一個胖子當(dāng)著我的面吹牛抵代,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忘嫉,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荤牍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庆冕?” 一聲冷哼從身側(cè)響起康吵,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎访递,沒想到半個月后晦嵌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拷姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年惭载,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响巢。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡描滔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵乓,到底是詐尸還是另有隱情伴挚,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布灾炭,位于F島的核電站茎芋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜈出。R本人自食惡果不足惜田弥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铡原。 院中可真熱鬧偷厦,春花似錦、人聲如沸燕刻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卵洗。三九已至请唱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十绑。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工聚至, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本橙。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓扳躬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甚亭。 傳聞我的和親對象是個殘疾皇子贷币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 異步編程對JavaScript語言太重要。Javascript語言的執(zhí)行環(huán)境是“單線程”的狂鞋,如果沒有異步編程片择,根本...
    呼呼哥閱讀 7,311評論 5 22
  • 在此處先列下本篇文章的主要內(nèi)容 簡介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢死閱讀 1,441評論 3 8
  • 本文作者就是我,簡書的microkof骚揍。如果您覺得本文對您的工作有意義,產(chǎn)生了不可估量的價值啰挪,那么請您不吝打賞我信不,...
    microkof閱讀 23,731評論 16 78
  • 簡介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同亡呵。本章詳細(xì)介紹...
    呼呼哥閱讀 1,075評論 0 4
  • 昨天送走敏兒竟然哭了 晚上和她視頻竟然不嫌煩了 我真是欠虐啊 不過一天沒回家竟然又屁顛屁顛歡天喜地回家去了 麻麻給...
    角落蜷縮閱讀 245評論 0 0