成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何理解JS中的Generator及協(xié)程

這篇文章主要講解了“如何理解JS中的Generator及協(xié)程”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何理解JS中的Generator及協(xié)程”吧!

綏芬河ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

生成器執(zhí)行流程

什么是生成器函數(shù)?

生成器是一個(gè)帶星號(hào)的"函數(shù)"(注意:它并不是真正的函數(shù)),可以通過yield關(guān)鍵字暫停執(zhí)行和恢復(fù)執(zhí)行的

舉個(gè)例子:

function* gen() {   console.log("enter");   let a = yield 1;   let b = yield (function () {return 2})();   return 3; } var g = gen() // 阻塞住,不會(huì)執(zhí)行任何語句 console.log(typeof g)  // object  看到了嗎?不是"function"  console.log(g.next())   console.log(g.next())   console.log(g.next())   console.log(g.next())    // enter // { value: 1, done: false }  // { value: 2, done: false } // { value: 3, done: true } // { value: undefined, done: true }

由此可以看到,生成器的執(zhí)行有這樣幾個(gè)關(guān)鍵點(diǎn):

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 調(diào)用 gen() 后,程序會(huì)阻塞住,不會(huì)執(zhí)行任何語句。

  3. 調(diào)用 g.next() 后,程序繼續(xù)執(zhí)行,直到遇到 yield 程序暫停。

  4. next 方法返回一個(gè)對(duì)象, 有兩個(gè)屬性: value 和 done。value 為當(dāng)前 yield 后面的結(jié)果,done  表示是否執(zhí)行完,遇到了return 后,done 會(huì)由false變?yōu)閠rue。

yield* 語法

當(dāng)一個(gè)生成器要調(diào)用另一個(gè)生成器時(shí),使用 yield* 就變得十分方便。比如下面的例子:

function* gen1() {     yield 1;     yield 4; } function* gen2() {     yield 2;     yield 3; }

我們想要按照1234的順序執(zhí)行,如何來做呢?

在 gen1 中,修改如下:

function* gen1() {     yield 1;     yield* gen2();     yield 4; }

這樣修改之后,之后依次調(diào)用next即可。

生成器實(shí)現(xiàn)機(jī)制——協(xié)程

可能你會(huì)比較好奇,生成器究竟是如何讓函數(shù)暫停, 又會(huì)如何恢復(fù)的呢?接下來我們就來對(duì)其中的執(zhí)行機(jī)制——協(xié)程一探究竟。

什么是協(xié)程?

協(xié)程是一種比線程更加輕量級(jí)的存在,協(xié)程處在線程的環(huán)境中,一個(gè)線程可以存在多個(gè)協(xié)程,可以將協(xié)程理解為線程中的一個(gè)個(gè)任務(wù)。不像進(jìn)程和線程,協(xié)程并不受操作系統(tǒng)的管理,而是被具體的應(yīng)用程序代碼所控制。

協(xié)程的運(yùn)作過程

那你可能要問了,JS 不是單線程執(zhí)行的嗎,開這么多協(xié)程難道可以一起執(zhí)行嗎?

答案是:并不能。一個(gè)線程一次只能執(zhí)行一個(gè)協(xié)程。比如當(dāng)前執(zhí)行 A 協(xié)程,另外還有一個(gè) B 協(xié)程,如果想要執(zhí)行 B 的任務(wù),就必須在 A 協(xié)程中將JS  線程的控制權(quán)轉(zhuǎn)交給 B協(xié)程,那么現(xiàn)在 B 執(zhí)行,A 就相當(dāng)于處于暫停的狀態(tài)。

舉個(gè)具體的例子:

function* A() {   console.log("我是A");   yield B(); // A停住,在這里轉(zhuǎn)交線程執(zhí)行權(quán)給B   console.log("結(jié)束了"); } function B() {   console.log("我是B");   return 100;// 返回,并且將線程執(zhí)行權(quán)還給A } let gen = A(); gen.next(); gen.next();  // 我是A // 我是B // 結(jié)束了

在這個(gè)過程中,A 將執(zhí)行權(quán)交給 B,也就是 A 啟動(dòng) B,我們也稱 A 是 B 的父協(xié)程。因此 B 當(dāng)中最后return 100其實(shí)是將 100  傳給了父協(xié)程。

需要強(qiáng)調(diào)的是,對(duì)于協(xié)程來說,它并不受操作系統(tǒng)的控制,完全由用戶自定義切換,因此并沒有進(jìn)程/線程上下文切換的開銷,這是高性能的重要原因。

感謝各位的閱讀,以上就是“如何理解JS中的Generator及協(xié)程”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何理解JS中的Generator及協(xié)程這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享名稱:如何理解JS中的Generator及協(xié)程
網(wǎng)站地址:http://jinyejixie.com/article12/iejidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營銷推廣、網(wǎng)站策劃網(wǎng)站營銷、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
钟祥市| 清徐县| 中超| 商城县| 德保县| 手游| 普兰县| 什邡市| 比如县| 佛冈县| 南澳县| 承德县| 宁南县| 闻喜县| 南宁市| 八宿县| 普洱| 灵宝市| 龙胜| 海盐县| 金沙县| 肥乡县| 宣武区| 河间市| 叶城县| 通化县| 北宁市| 钦州市| 延津县| 公安县| 克山县| 富川| 康乐县| 綦江县| 莱芜市| 扶绥县| 鲁甸县| 松溪县| 扎鲁特旗| 喀喇| 雷山县|