精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

答網友問:Await 一個 Promise 對象到底發生了什么

云計算 云原生
讓我們看一遍 Node.js 官網對 event-loop 的描述。它強調了一個重點:JS code 是以單線程方式被執行的。

大家好,我是二哥。

前兩篇文章發出來后,有一些網友在后臺咨詢我一些問題,我把它們歸總羅列在一起。這篇文章既是答網友問也是對前兩篇的補充和復習。

先放下前兩篇的鏈接。

?圖解 Node.js 的核心 event-loop?

??多圖剖析公式 async=Promise+Generator+自動執行器??

圖片

圖 1:async 函數代碼示例

問 0:上一篇所提到的 generator 和自動執行器是運行在不同的線程里面嗎?

答 0:無論是 generator 還是自動執行器,都是在 event-loop 線程也就是運行 JS code 的主線程里面運行的。再強調一遍:它倆不是在兩個線程里面運行的。

讓我們再看一遍 Node.js 官網對 event-loop 的描述。它強調了一個重點:JS code 是以單線程方式被執行的。

The event loop is what allows Node.js to perform non-blocking I/O operations  despite the fact that JavaScript is single-threaded  by offloading operations to the system kernel whenever possible.

問 1:await p 這條語句產生了異步請求了嗎?

答 1:不,它沒有。await 只是在等待 p 狀態的改變,無論狀態是從 pending 變成 resolved 還是從 pending 變為 rejected 。

問 2:那異步請求是什么時候產生的?

答 2:是在 Promise 的 executor 里面,執行 setTimeout 時產生的。

?下文把 new Promise() 時傳遞進去的 callback (resolve, reject)=>{ /* your code */} 稱為 executor 。其中參數 resolve 和 reject 是由 Promise 自己實現的。需要注意的是這個 executor 是在 new Promise() 的時候,立即執行的。

假如我們在 executor 里面執行的是 fs.read(fd[, options], callback) 這樣的語句,那類似地,異步請求是在調用 fs.read() 時產生的。?

問 3:p 狀態改變后,為什么通過 resolve(200) 傳遞的 200 會變成變量 res 的求值結果?

答 3:這就是為什么說我們需要了解 await 背后的實現原理。我們借助圖 2 和圖 4 來復習一下。

如圖 2 所示,async 函數首先轉換成了 generator 函數。但 generator 函數自己是不能自動運行的,所以得搭配一個自動執行器,驅動它往前走。自動執行器如同慈愛的媽媽,而 generator 就像那個懵懂的幼兒。小孩子每走一段路都會停下來,回頭看看在他身后寸步不離的媽媽,得到媽媽的鼓勵或者獎勵后,再走向下一個目標。

圖片

圖 2:async 函數轉換成 generator 函數示例

在講解圖 4 之前,還是有必要再次復習兩個重要的概念:yield 表達式和 yield 語句。如圖 3 所示:

  • a+b 是表達式,它的求值結果影響到的是 { value: xxx, done: xxx } 中的 value 屬性,而 { value: xxx, done: xxx } 是調用者通過迭代器調用 next() 方法的返回值 。
  • yield a+b 是 yield 語句,調用者可以通過給 next() 方法傳實參來影響 yield 語句的返回值。比如 next(200) 則會使得變量 a1 為 200 。

圖 3 還畫出了一個重要的地方:generator 函數執行的暫停點:在 yield 表達式求值結束之后,但 yield 語句返回之前。

圖片

圖 3:yield 表達式和 yield 語句對比

為了更好更清晰地回答問題 3,二哥給大家畫了圖 4 。

?這一步開始通過執行器調用 generator。

② 雖然對 generator 真正的調用發生在這里,但 generator 函數在 ② 這步其實什么都沒有做,只是立即返回了一個迭代器。

③ 自動執行器從這里開始進入驅動 generator 模式。③ 這一步沒有給形參 data? 賦值,因為我們不能在第一次執行  g.next() 的時候給它注入一個值。

④ 這一步每調用一次  g.next() 就會使得 generator 從上次暫停于 yield 的位置開始運行,直到再次遇到 yield 。

⑤ 所以第一次對  g.next() 調用使得左側 generator 函數從函數起始位置一直運行直到遇到 yield 。

我們看到 ⑤ 所標識出來的代碼執行過程其實是創建了一個 Promise 對象,且在 Promise 的 executor 里面設置了一個 1s 鐘的定時器。注意,這個 executor 是在創建 Promise 對象時立即執行的,不過 ⑦ 處的代碼要等到 1s 之后才會執行。

⑥ generator 函數暫停之前,先會將 yield 表達式的求值結果通過 { value: xxx, done: xxx} 返回給  g.next() 調用方,也即右圖 ④ 位置。 

所以你一定猜到了,右圖 ④ 位置的變量 result 為 { value: p, done: false} 。這里的 p 就是 ⑤ 執行過程中產生的 Promise 對象。

通過這樣的方式,Promise 對象在 generator 函數和自動執行器之間流轉。真是一個巧妙的過程。

那么你在右側 ⑧ 處看到 result.value.then(callback) 這樣的語句就不會感到納悶了,這是 Promise 的標準用法。當 p 的狀態變成 resolved 后,⑧ 處的 callback 自然就會得到運行的機會了。

⑦ 1s 很快,滴答一下過去后,resolve(200) 得以運行。它的運行使得 p 的狀態變成 resolved,所以在  ⑧ 處耐心等待的 callback 開始了它的工作。

⑧ 是的,這個時候 data 的值為 200 。這是再自然不過的事,如果你對 Promise 的使用了然于胸的話。

⑨ 自動執行器又一次執行 next(data)? 。不過這一次給它傳了一個實參 200 。所以這一次 ④ 處執行的代碼變為: g.next(200) 。

⑩ 自動執行器執行  g.next(200) 必然會驅使 generator 函數動身繼續往前趕路。

還記得 generator 函數上次停在哪里休息的嗎?對,左側 ⑤ 處箭頭所指的位置。generator 函數恢復運行后干的第一件事就是對 yield 語句求值。

如果像   g.next()?  這樣驅動它的話,yield 語句返回的是 undefined 。不過這次我們不一樣,因為我們執行的是  g.next(200) 。很巧妙,傳給 next() 的實參  200 作為 yield 語句的返回值賦值給了左側變量 res?

圖片

圖 4:generator + 自動執行器細節圖

讓我們再回頭看下圖 1 的示例代碼,我們來做個總結:

  1. await p 語句是個糖衣,它包裹的是 yield p 語句 + 自動執行器。
  2. 所謂 await p 暫停并不是說主線程執行  JS  code 暫停了。相反主線程還在繼續執行其它的 JS code 。
  3. await 是在等待 p 的狀態發生變化。這個等待時間有多長?這完全取決于創建 p 的時候,  executor 里面何時會調用 resolve() 或 reject() 。
  4. 執行 await p 語句的時候,無論 p 的狀態是否已經發生了變化,執行到 await p 都會導致 V8 engine 轉而去自動執行器里面執行。這是 yield p 語句使然。
  5. 動執行器如同一個如影隨形的媽媽,她拿到 p 之后,會耐心地等待,直到得到 p 狀態改變后的 value 。最后再通過 g.next(value) 把 value 返回給它摯愛的 generator 函數。

圖片

圖 5:同圖 1

責任編輯:姜華 來源: 二哥聊云原生
相關推薦

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2019-11-12 14:41:41

Redis程序員Linux

2010-02-07 09:00:29

AndroidLinux Kerne

2020-09-01 11:40:01

HTTPJavaTCP

2022-05-26 23:36:36

SQLMySQL數據

2020-10-09 08:59:55

輸入網址解密

2015-07-03 09:27:43

網絡閏秒

2021-02-25 10:02:32

開機鍵Linux內存

2019-12-10 09:42:57

OOM運維內存

2017-04-11 13:54:49

HTTPURLHTML

2025-04-27 08:11:26

2010-06-04 10:12:43

馬化騰

2022-05-31 13:58:09

MySQL查詢語句

2024-11-04 09:10:00

2017-04-10 15:57:10

AsyncAwaitPromise

2024-11-04 08:10:00

2018-12-24 09:47:06

2019-08-26 09:35:25

命令ping抓包

2020-07-28 23:22:35

制造業工業物聯網IIOT

2021-01-18 08:23:23

內存時底層CPU
點贊
收藏

51CTO技術棧公眾號

黄视频网站在线观看| 久久理论片午夜琪琪电影网| 97在线视频国产| 好男人www社区| 成年人午夜剧场| jk漫画禁漫成人入口| 欧美一区精品| 欧美三级在线播放| 精品免费国产| wwwwww日本| 黄色激情在线播放| 国产精品污污网站在线观看| 欧美一区二区三区…… | 黄色软件视频在线观看| 国产蜜臀97一区二区三区| 97精品视频在线观看| 免费一级做a爰片久久毛片潮| gogo久久| 国产成人亚洲综合a∨猫咪| 最近2019年好看中文字幕视频| 亚洲国产精品久久久久婷蜜芽| www天堂在线| 欧美a级一区| 亚洲日韩中文字幕在线播放| 日本免费黄视频| 毛片免费不卡| 国产在线麻豆精品观看| 久久精品中文字幕免费mv| 奇米视频888| 日韩毛片久久久| 麻豆精品一区二区| 久久精品国产69国产精品亚洲| 老司机午夜免费福利| h片在线观看视频免费| 国产精品视频一区二区三区不卡| 国产偷久久久精品专区| 久久久久久久久久免费视频| 久久悠悠精品综合网| 舔着乳尖日韩一区| 久久综合狠狠综合久久综青草 | 91九色精品国产一区二区| 在线观看日韩精品| 亚洲激情一区二区| 亚洲综合视频在线播放| 亚洲精品va| 精品播放一区二区| 97成人在线观看视频| 18av在线播放| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 尤物网站在线看| 尤物在线网址| 亚洲欧洲av另类| 成人欧美一区二区| 国产精品美女久久久久av爽| 欧美热在线视频精品999| 欧美日韩一区小说| 国产日韩成人内射视频| 中文在线免费二区三区| 国产精品久久久久婷婷| 99久热re在线精品996热视频| 日韩av在线电影| 国产精品免费大片| 91精品欧美一区二区三区综合在 | 久久国产免费| 亚洲午夜久久久影院| 天天影视色综合| 免费视频成人| 亚洲大片免费看| 日本在线播放一区| 国产suv一区二区| 国产欧美二区| 美日韩丰满少妇在线观看| 亚洲国产综合视频| 小说区图片区亚洲| 欧美性69xxxx肥| 国产美女视频免费| 亚洲人在线观看视频| 久久av老司机精品网站导航| 69av成年福利视频| 日日骚一区二区三区| 精品久久成人| 亚洲国产日韩一区| 日韩欧美中文视频| 亚洲第一会所| 欧美日韩在线免费| 日韩精品福利片午夜免费观看| 色猫av在线| 国产69精品久久99不卡| 国产在线观看精品| 成人免费视频毛片| 日本不卡一二三区黄网| 97视频在线观看视频免费视频 | 国产91aaa| 亚州av在线播放| 国产女主播一区| 成人污网站在线观看| 日本ー区在线视频| 国产精品色噜噜| 高清无码一区二区在线观看吞精| 麻豆mv在线看| 亚洲国产成人porn| 精品视频无码一区二区三区| 激情aⅴ欧美一区二区欲海潮| 欧美视频一区二区三区…| 日本久久久久久久久久久久| 竹内纱里奈兽皇系列在线观看| 欧洲亚洲精品在线| 亚洲精品在线网址| 亚洲人成亚洲精品| 日韩av综合网| 亚洲制服丝袜在线播放| 首页国产精品| 色黄久久久久久| 久久久久久久99| 韩国女主播成人在线| 国产99久久精品一区二区永久免费 | 熟妇人妻一区二区三区四区| 国产麻豆一精品一av一免费| 国产精品自产拍在线观看| 亚洲综合成人av| 日韩国产成人精品| 日本成人免费在线| 久久黄色精品视频| 寂寞少妇一区二区三区| 九九九九精品| 国产黄a三级三级看三级| 99视频一区二区| 久久精品国产精品青草色艺| 国产三区视频在线观看| 亚洲蜜臀av乱码久久精品| 超碰97在线看| 成人黄色在线| 欧美日韩成人综合在线一区二区| 欧美午夜精品理论片| 麻豆视频久久| 亚洲国产精品久久精品怡红院 | 国产亚洲一区二区三区四区 | 国产精品久久久久久久久久久久久久| 亚洲成人av影片| 日本亚洲一区二区| 久久精品国产精品国产精品污 | 美女久久久久久久久久| 亚洲宅男一区| 91精品国产乱码久久久久久久久| 亚洲第一精品网站| av在线免费不卡| 精品久久久无码人妻字幂| 亚洲最大的免费视频网站| 91精品国产欧美一区二区成人| 三大队在线观看| 色爱综合av| 精品国产一区二区三区久久久| 久久国产在线视频| 久久精品日韩欧美| 欧美性色黄大片人与善| 国产91在线视频蝌蚪| 天天综合色天天综合| 精品一区二区三区四区五区六区| 欧美特黄一区| 国产成人精品久久二区二区91| 一本一道人人妻人人妻αv| 日本一区二区三区四区| 日本在线一二三区| 国内精品麻豆美女在线播放视频 | 91精品国产综合久久婷婷香蕉 | 国产女人18毛片水真多18| 激情国产一区| 国产精品手机播放| av电影在线播放高清免费观看| 玉足女爽爽91| 欧美日韩第二页| 亚洲日本va中文字幕| 亚洲深夜福利在线| 国产男人搡女人免费视频| 中文字幕第一区第二区| 在线观看岛国av| 欧美日韩三级| 精品欧美一区二区在线观看视频| 麻豆mv在线看| 色久欧美在线视频观看| 成人激情四射网| 日韩欧美国产免费播放| 日本不卡一区视频| 亚洲永久免费| 97久久精品午夜一区二区| 成年人在线视频| 五月综合激情婷婷六月色窝| 999热精品视频| 激情婷婷欧美| 日韩免费三级| 久久久久久爱| 38少妇精品导航| 日本不卡三区| 亚洲精品国产拍免费91在线| 久久久久精彩视频| 一区二区三区中文字幕电影| 三级男人添奶爽爽爽视频| 美女高潮久久久| 亚洲国产成人精品无码区99| 欧州一区二区三区| www.久久久久| 五月婷婷开心中文字幕| 欧美群妇大交群的观看方式| 日本中文字幕网| 国产精品乱人伦| 99久久国产精| 99精品国产在热久久| 国产精品对白刺激久久久| 久久野战av| 欧美日韩国产成人在线| 一卡二卡三卡在线| 国产精品久久久久一区二区三区| 国产伦精品一区二区三区精品| 免费在线看成人av| 亚洲精品不卡| 欧美三级午夜理伦三级在线观看| 国模视频一区二区| 在线观看麻豆| 亚洲少妇激情视频| 天天摸夜夜添狠狠添婷婷| 91精品免费在线观看| 69xxxx国产| 国产精品入口麻豆九色| 精品无码人妻少妇久久久久久| 美日韩一级片在线观看| 女人喷潮完整视频| 亚洲人成精品久久久 | 中文久久久久久| 国产麻豆精品久久| 不卡一卡2卡3卡4卡精品在| 精品久久久网| 国产大片精品免费永久看nba| 99在线视频影院| 国产一区二区三区精品久久久| 午夜激情在线视频| 精品久久久久久久久久久久久久久| 九九这里只有精品视频| 国产一二精品视频| 国产精品久久久毛片| 久久亚洲风情| 中文字幕一区综合| 国产成人tv| 成人午夜影院在线观看| 国产精品毛片aⅴ一区二区三区| 欧美激情第99页| 色婷婷激情五月| 精品欧美久久久| 性欧美videos另类hd| 日韩一区二区三区视频在线| 国产污视频在线看| 国产午夜亚洲精品不卡| 泷泽萝拉在线播放| 91麻豆精品一区二区三区| 国产精品自拍视频在线| 日本va欧美va精品| 国产小视频精品| 另类小说一区二区三区| 亚洲一区在线不卡| 久久电影网站中文字幕| 天堂在线一区二区三区| 国产在线精品视频| 欧美午夜精品一区二区| 日韩高清不卡一区二区| 爆乳熟妇一区二区三区霸乳| 免费观看成人av| 男人午夜视频在线观看| 国产乱色国产精品免费视频| 免费看的av网站| 成人国产电影网| 久热在线视频观看| 国内精品免费**视频| 亚洲av无一区二区三区久久| 国产精品伊人色| 国产xxxx视频| 国模无码大尺度一区二区三区| 一二三av在线| www.日韩在线| www久久久久久久| 99久久精品一区| 90岁老太婆乱淫| 中文字幕中文字幕一区| 久久久久久久久久久国产精品| 久久久久久夜精品精品免费| 日本成人xxx| 成人手机电影网| 久久6免费视频| 国产激情精品久久久第一区二区| 亚洲 欧美 日韩在线| 国产亚洲一二三区| 国产探花在线免费观看| 精品久久香蕉国产线看观看亚洲| 中文字幕乱码视频| 黑人巨大精品欧美一区二区一视频 | 高清在线视频不卡| 国产精品jizz在线观看麻豆| 欧美黄视频在线观看| 日本欧洲国产一区二区| 国产精品毛片久久久| 日本一区二区精品视频| 午夜精品av| 国产一级片黄色| 成人免费视频一区二区| av免费播放网站| 精品久久久久久国产91| 国产精品-色哟哟| 欧美精品电影在线播放| 一级特黄色大片| 亚洲精品国产精品自产a区红杏吧| 在线观看麻豆蜜桃| 欧美一区二区.| 成人激情自拍| 国产91精品入口17c| 日本精品三区| 中文字幕一区二区三区最新| 亚洲中午字幕| 免费看的av网站| 中文字幕制服丝袜一区二区三区| 成人午夜淫片100集| 黑人巨大精品欧美一区二区一视频| 国产美女三级无套内谢| 日韩欧美一二区| 国产成人无码www免费视频播放| 精品国产人成亚洲区| 色哟哟免费在线观看| 国产91色在线免费| 老牛精品亚洲成av人片| 国产 欧美 日韩 一区| 99精品福利视频| 国产成人av免费观看| 国产精品人妖ts系列视频| 国产成人综合欧美精品久久| 欧美精品一区二区蜜臀亚洲| 婷婷av在线| 91高清视频免费观看| 亚洲va欧美va人人爽成人影院| 中文字幕中文字幕在线中心一区| 日韩电影在线观看电影| a级片在线观看| 欧美性猛交xxxx免费看久久久| 日本黄色一区二区三区| 亚洲欧美色婷婷| 日本不卡视频| 国产美女精彩久久| 郴州新闻综合频道在线直播| 男人的天堂日韩| 国产日产欧产精品推荐色| 无码日韩精品一区二区| 亚洲欧美精品一区| www.com.cn成人| 日韩久久久久久久| 久久精品国产在热久久| 殴美一级黄色片| 精品久久香蕉国产线看观看亚洲 | 国产美女亚洲精品7777| 在线观看日韩羞羞视频| 国产综合色视频| 激情五月少妇a| 精品国产乱码久久久久久免费| 超碰中文在线| 国产精品久久久久国产a级| 国产毛片一区二区三区 | 日本一区二区三区视频在线| 亚洲淫片在线视频| 西野翔中文久久精品国产| 大j8黑人w巨大888a片| 久久新电视剧免费观看| 卡通动漫亚洲综合| 日韩欧亚中文在线| 成人黄色在线观看视频| 国模极品一区二区三区| 国产91精品对白在线播放| 欧美三级理论片| 亚洲女人小视频在线观看| 成人午夜免费在线观看| 欧美中文字幕在线观看| 日韩欧美三级| jizzjizzxxxx| 欧美国产日韩精品免费观看| 国产又粗又大又爽| 欧美激情亚洲综合一区| 国产精品白丝久久av网站| av动漫在线免费观看| 91香蕉视频mp4| 艳妇乳肉豪妇荡乳av| 欧美激情18p| 欧洲视频一区| 国产精品91av| 欧美日韩在线视频首页| 国产网站在线免费观看| 久久精品magnetxturnbtih| 久久99热这里只有精品| 少妇一级淫片免费放中国 | 色999久久久精品人人澡69| 成人免费a级片| 欧美高清在线精品一区| 老牛影视av牛牛影视av| 国产精品三级久久久久久电影| 网友自拍一区| 亚洲第一成肉网| 色8久久人人97超碰香蕉987|