精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品毛片a∨一区二区三区|国 | 日韩成人毛片视频| 中文字幕久久精品一区二区| 性做久久久久久免费观看| 欧美主播一区二区三区美女 久久精品人 | 欧美色图天堂网| 黑人巨大国产9丨视频| 天堂av中文字幕| 久久国产精品露脸对白| 国内精品久久久久久久| 国产亚洲精品精品精品| 超碰97久久| 欧美日本在线看| 69堂免费视频| 天堂av资源在线观看| 久久久www免费人成精品| 91久久偷偷做嫩草影院| 国产亚洲欧美日韩高清| 亚洲三级观看| 久久中文字幕在线视频| 91成年人网站| 欧美绝顶高潮抽搐喷水合集| 51精品视频一区二区三区| 欧美国产亚洲一区| 污污的网站在线看| 中文字幕综合网| 日本午夜精品一区二区| 无码精品人妻一区二区三区影院| 国产一区啦啦啦在线观看| 国产精品99久久久久久www| 久久久精品国产sm调教网站| 日韩精品一区二区三区免费观看| 亚洲精品第一国产综合精品| 国产人妻精品午夜福利免费| 青草综合视频| 欧美午夜电影在线播放| 日本wwww视频| 忘忧草在线影院两性视频| 亚洲精品国产无天堂网2021| 亚洲精品久久区二区三区蜜桃臀 | 久本草在线中文字幕亚洲| 欧美久久久久久久久久| 一区二区xxx| 99re66热这里只有精品4| 黑人狂躁日本妞一区二区三区| 蜜臀av性久久久久蜜臀av| 日本成人网址| 亚洲欧洲国产专区| 在线免费观看成人网| 欧美高清视频| 综合精品久久久| 9l视频自拍9l视频自拍| 黄色在线论坛| 亚洲精品伦理在线| 特大黑人娇小亚洲女mp4| 好吊日视频在线观看| 国产农村老头老太视频| 亚洲h色精品| 日韩在线观看免费| 国产人与禽zoz0性伦| 欧美黄色录像片| 视频在线观看一区二区| 激情无码人妻又粗又大| 午夜激情久久| 麻豆国产va免费精品高清在线| 日韩精品123区| 久久久久久久久久久妇女 | 国产交换配乱淫视频免费| 奇米777国产一区国产二区| 日韩av在线直播| 中文字幕免费看| 国产精品片aa在线观看| 在线日韩欧美视频| 视频国产一区二区| 欧美日韩在线大尺度| 国模极品一区二区三区| 国产无遮挡呻吟娇喘视频| 欧美一级视频| 国产精品美女久久久久久免费| 国产又粗又猛视频免费| 国内精品伊人久久久久影院对白| 成人av资源网| 日韩一二三四| 国产精品视频yy9299一区| 一区二区三区四区久久| 久久久久黄久久免费漫画| 五月天亚洲精品| 六月激情综合网| 欧美黄页免费| 精品播放一区二区| 欧美成人午夜精品免费| 日韩高清欧美| 欧美激情视频一区二区三区不卡| 可以在线观看av的网站| 免费看黄色91| 国产精品免费视频一区二区| 久久经典视频| 亚洲人成在线播放网站岛国| 777av视频| 91成人抖音| 欧美一区二区网站| 男女黄床上色视频| 希岛爱理av一区二区三区| 韩国日本不卡在线| 亚洲一区二区人妻| 99久久99久久综合| 中文字幕一区二区三区四区五区六区 | 免费无码国产精品| 国产精品中文字幕日韩精品| 美女黄毛**国产精品啪啪| 日本三级在线视频| 欧美日韩亚洲精品一区二区三区| 一区二区在线免费看| 日韩欧美ww| 欧美精品在线免费播放| 国产精品尤物视频| av激情综合网| 青青视频免费在线| 成人mm视频在线观看| 亚洲第一精品电影| 午夜爽爽爽男女免费观看| 久久成人精品| 国产一区二区三区奇米久涩| 日本美女高清在线观看免费| 一本色道亚洲精品aⅴ| 四虎永久免费观看| 一区二区在线影院| 国产精品亚洲一区二区三区| 亚洲欧美日韩精品永久在线| 一区二区三区免费网站| 不卡的av中文字幕| 欧美码中文字幕在线| 97香蕉久久夜色精品国产| 国产精品久久综合青草亚洲AV| 久久麻豆一区二区| 九一国产精品视频| 亚洲精品一区二区三区在线| 日韩中文字幕在线看| 无码人妻精品一区二区三区蜜桃91| 成人久久18免费网站麻豆 | 欧美性受xxxx黑人xyx性爽| www.超碰97| 国产精品久久久久久久免费软件 | 97av在线视频| 高清国产mv在线观看| 一区二区三区中文字幕电影 | 粉嫩av一区二区三区| 致1999电视剧免费观看策驰影院| 日日夜夜天天综合| 亚洲欧洲日韩国产| 在线免费观看国产精品| 久久综合av免费| 成人黄色片视频| 欧美禁忌电影网| 国产精品va在线播放| 福利在线午夜| 欧美日韩精品久久久| 后入内射无码人妻一区| 久久99国产精品久久99| 男女h黄动漫啪啪无遮挡软件| 日韩综合av| 久久视频在线看| 亚洲AV无码成人片在线观看| 一区二区激情视频| av av在线| 国产精品久久久久久模特| 久久综合入口| 欧洲成人一区| y97精品国产97久久久久久| 99精品免费观看| 亚洲一区在线观看网站| 91视频啊啊啊| 免费人成在线不卡| 亚洲精品天堂成人片av在线播放| 香港久久久电影| 欧美一级高清免费| 都市激情在线视频| 欧美一级高清大全免费观看| 国产无遮挡裸体免费视频| 91视频xxxx| 污污的网站18| 国产精品分类| 欧美日韩电影一区二区| 欧美综合影院| 97色在线观看免费视频| 成年人在线观看| 日韩欧美电影一区| 久久精品无码av| 中文字幕五月欧美| 亚洲图片综合网| 青青草一区二区三区| 黄色小视频大全| 希岛爱理av免费一区二区| 国产在线视频2019最新视频| 黑人极品ⅴideos精品欧美棵| 日韩精品免费在线观看| 国产精品无码久久久久成人app| 亚洲一区二区三区视频在线播放| japanese中文字幕| 国精产品一区一区三区mba桃花| 日本手机在线视频| 999精品视频| 久久99久久精品国产| 95精品视频| 日本精品久久久久久久| 在线播放免费av| 国产亚洲欧美另类中文| 欧美一区二区三区黄片| 欧美老人xxxx18| 国产精品一区无码| 亚洲国产cao| 北条麻妃在线观看视频| 不卡视频免费播放| 伊人免费视频二| 久久经典综合| 欧美日韩一道本| 欧美日韩视频| 这里只有精品66| 国产精品一区二区三区av麻| 国产精品久久久久免费| 综合欧美精品| 国产精品激情自拍| 欧美久久天堂| 午夜精品一区二区三区在线| 黄色在线观看网站| 最近中文字幕日韩精品 | 91免费视频网| 国产视频精品视频| 国产精品888| 亚洲男人天堂2021| 免费人成在线不卡| 久久婷婷国产91天堂综合精品| 亚洲伦伦在线| 人人干视频在线| 黄色成人91| 亚洲一区二区三区av无码| 在线精品小视频| 99亚洲国产精品| 66视频精品| 黄色免费高清视频| 亚洲女同中文字幕| 麻豆md0077饥渴少妇| 国产精品国产三级国产在线观看| 日韩精品一区二区三区外面| 猛男gaygay欧美视频| 国产无套精品一区二区| 黄色网一区二区| 国产精品一区在线播放| 高清一区二区三区| 国产在线精品一区二区中文| 狼人天天伊人久久| 久久精品国产精品国产精品污 | 亚洲精品成人久久| 少妇激情av一区二区| 亚洲毛片在线观看| 可以在线观看的黄色| 一区二区三区黄色| 欧美日本高清| 欧美成人免费播放| 91九色porn在线资源| 欧美伊久线香蕉线新在线| 欧美成人黑人| 国产精品视频一区国模私拍| 亚洲一区有码| 国产精品久久久久免费| 色老板在线视频一区二区| 日本欧美色综合网站免费| 久久综合成人| 婷婷视频在线播放| 在线不卡视频| 成人亚洲视频在线观看| 久久99精品网久久| 男人的天堂免费| 久久众筹精品私拍模特| 极品尤物一区二区| 亚洲最快最全在线视频| 黄色在线观看国产| 欧美日韩另类一区| 国内爆初菊对白视频| 亚洲乱亚洲乱妇无码| 精品国产丝袜高跟鞋| 97色在线视频观看| 欧美天堂一区二区| 国产伦精品一区二区三区照片| 国产99久久| 伊人网在线免费| 免费日韩av片| 四虎成人在线播放| 久久午夜老司机| 欧美做爰啪啪xxxⅹ性| 亚洲成a人在线观看| 18国产免费视频| 精品成人在线观看| 三区四区电影在线观看| 97久久超碰福利国产精品…| 国产91在线播放精品| 国产精品日韩一区二区| 日韩欧美高清在线播放| 国产肉体ⅹxxx137大胆| 免费观看在线色综合| 午夜男人的天堂| 亚洲视频图片小说| 一级片免费网址| 欧美美女bb生活片| 蝌蚪视频在线播放| 海角国产乱辈乱精品视频| 黄色欧美视频| 快播日韩欧美| 国产精品久久| 中国黄色片一级| 久久久久国产精品厨房| 国产一级片免费| 欧美电影一区二区三区| 巨骚激情综合| 91av视频在线观看| 91麻豆精品国产91久久久久推荐资源| 五月天色一区| 免费亚洲一区| 亚洲av成人片色在线观看高潮| 日韩美女精品在线| 97人妻精品视频一区| 亚洲毛片在线免费观看| 蜜臀av在线| 成人字幕网zmw| 手机在线电影一区| 久久精品网站视频| 99r国产精品| 国产性猛交普通话对白| 欧美一区二区在线不卡| 毛片在线看片| 成人国产精品日本在线| 成人3d动漫在线观看| 欧美激情国产精品日韩| 97se亚洲国产综合在线| 国产精品第一页在线观看| 日韩一区二区电影在线| 好吊日视频在线观看| 91九色视频在线| 91成人观看| 熟妇无码乱子成人精品| 亚洲欧美激情小说另类| 国产亲伦免费视频播放| 久久精品国产96久久久香蕉| 欧美成人福利| 亚洲一区二区三区在线观看视频| 奇米影视7777精品一区二区| 第一次破处视频| 欧美调教femdomvk| 在线观看完整版免费| 91精品国产自产在线老师啪 | 欧美人成在线观看| 成人视屏免费看| 国产成人精品一区二三区| 日韩av影片在线观看| 亚洲欧洲自拍| 日韩欧美亚洲日产国| 久色婷婷小香蕉久久| 北条麻妃在线观看视频| 欧美一区永久视频免费观看| 婷婷在线播放| 精品国产乱码久久久久| 久久精品一区二区三区中文字幕 | 国内精品久久久久久久久久| 久久福利视频网| 国产精品xxxav免费视频| 欧美 日韩 国产在线观看| 久久综合久久综合久久综合| 无码任你躁久久久久久久| 亚洲最新av在线网站| 国产精品va视频| 免费超爽大片黄| 91麻豆产精品久久久久久| 最新中文字幕在线观看视频| 久久精品亚洲一区| 成人在线tv视频| 国产麻花豆剧传媒精品mv在线| 中文字幕国产一区| 草逼视频免费看| 啪一啪鲁一鲁2019在线视频| 日韩欧美自拍| 国产51自产区| 在线欧美日韩国产| 午夜在线激情影院| 欧美中文娱乐网| 国产精品一区三区| 国产精品第5页| 久久视频这里只有精品| 欧美中文一区| 亚洲精品第三页| 欧美日韩亚洲一区二| 日本激情在线观看| 国严精品久久久久久亚洲影视| 免费高清在线一区| 国产性70yerg老太| 中文字幕久热精品视频在线| 成人免费在线电影网| 超碰av在线免费观看| 亚洲一区二三区| 一区二区三区视频在线观看视频| 国模一区二区三区私拍视频|