<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Node.js Stream ondata觸發(fā)時機與順序的探索

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:00:09
        文檔

        Node.js Stream ondata觸發(fā)時機與順序的探索

        Node.js Stream ondata觸發(fā)時機與順序的探索:上次寫Stream pipe細節(jié)時,在源碼中發(fā)現(xiàn)一段無用邏輯,由此引發(fā)了對Stream data事件觸發(fā)時機與順序的探索。 無用邏輯 當時研究pipe細節(jié)是基于Node.js v8.11.1的源碼,其中針對上游的ondata事件處理有如下一段代碼: // If the user pus
        推薦度:
        導讀Node.js Stream ondata觸發(fā)時機與順序的探索:上次寫Stream pipe細節(jié)時,在源碼中發(fā)現(xiàn)一段無用邏輯,由此引發(fā)了對Stream data事件觸發(fā)時機與順序的探索。 無用邏輯 當時研究pipe細節(jié)是基于Node.js v8.11.1的源碼,其中針對上游的ondata事件處理有如下一段代碼: // If the user pus
      1. 場景二:每次_read異步push一次數(shù)據(jù)
      2. 當發(fā)生第一次讀取,異步push的數(shù)據(jù)將直接通過emit data傳遞到ondata中,而read函數(shù)中的emit由于無法從緩沖區(qū)讀取數(shù)據(jù)從而不會觸發(fā),同時read返回null導致while循環(huán)也相應停止,此種情況下異步push觸發(fā)data事件后,緊接著的stream.read(0)會繼續(xù)保持流的流動,當dest.write(chunk)返回false,count++執(zhí)行一次并將流暫停,緊接著會繼續(xù)調用一次read,但這次數(shù)據(jù)將被放入緩沖區(qū)且不觸發(fā)data事件,count++依舊只執(zhí)行一次。

        場景二流暫停一次后再次流動時,數(shù)據(jù)消耗模式與之前會有所差異,會優(yōu)先消耗緩沖區(qū)數(shù)據(jù)直至為空時回到之前的模式,但這同樣不會導致count++執(zhí)行多次。

      3. 場景三:每次_read多次同步push數(shù)據(jù)
      4. 與場景一類似,只是每次_read會多次往緩沖區(qū)寫入數(shù)據(jù),最終data事件還是依靠從緩沖區(qū)讀數(shù)據(jù)后觸發(fā)。

      5. 場景四:每次_read多次異步push數(shù)據(jù)
      6. 同場景二類似,假設在一次_read中有兩次異步push,當?shù)谝粋€異步push執(zhí)行時,data事件觸發(fā)且其中的dest.write(chunk)返回false,導致count++同時流被暫停,等第二個異步push執(zhí)行時,由于流已經(jīng)暫停,數(shù)據(jù)將寫入緩沖區(qū)而不是觸發(fā)data事件,所以count++只執(zhí)行一次。

      7. 場景五:_read操作可能同步或異步push
      8. 不管是同步或者異步push,當一次ondata內部將流設置為暫停模式后,flow函數(shù)中while條件state.flowing為false將導致stream.read不再調用,異步的push的emit data判斷條件同樣不再滿足,即目前階段內部不會再有data事件觸發(fā)直到外部再次間接或直接調用read方法。

        以上五個場景是為了分析該問題而模擬的,實際只要能理解第五個場景就能明白所有。

        小結

        文章最終寫出來的內容與我最開始的初衷所偏離,而且自己不知道如何評價這篇文章的好壞,但為了寫這文章花了兩天業(yè)余時間去深入理解stream.Readable卻是非常有收獲的一件事情,更堅定自己在寫文章的路途上可以走的更遠。

        PS:猜測為什么有爛電影的存在,可能是因為導演長時間投入的創(chuàng)作會讓他迷失在內部而無法發(fā)現(xiàn)問題,寫文章也是,難以通過閱讀去優(yōu)化費心思寫的文章。

        PS:下圖是美團博客的,也許我寫了這么多卻抵不上這張圖,說明方式很重要。

        總結

        聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Node.js Stream ondata觸發(fā)時機與順序的探索

        Node.js Stream ondata觸發(fā)時機與順序的探索:上次寫Stream pipe細節(jié)時,在源碼中發(fā)現(xiàn)一段無用邏輯,由此引發(fā)了對Stream data事件觸發(fā)時機與順序的探索。 無用邏輯 當時研究pipe細節(jié)是基于Node.js v8.11.1的源碼,其中針對上游的ondata事件處理有如下一段代碼: // If the user pus
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲视频一区二区| 亚洲码欧美码一区二区三区| jizz中国免费| 亚洲精品在线视频| 亚洲激情电影在线| 久久久久久精品免费免费自慰| 国产禁女女网站免费看| 亚洲精品无码人妻无码| 国产黄色片在线免费观看| 亚洲的天堂av无码| 在线观看无码AV网站永久免费| 久久夜色精品国产亚洲av | 国内精品久久久久影院亚洲| 日本成年免费网站| 亚洲αⅴ无码乱码在线观看性色| 国产无遮挡吃胸膜奶免费看 | 亚洲日韩一区二区三区| 日韩免费福利视频| yellow免费网站| 成人爽A毛片免费看| 色噜噜的亚洲男人的天堂| 亚洲性久久久影院| 亚洲a一级免费视频| 亚洲一线产品二线产品| 日韩人妻无码精品久久免费一| 亚洲成人午夜电影| 精品国产免费一区二区| 黄色视频在线免费观看| 免费在线观看a级毛片| 亚洲人成未满十八禁网站| mm1313亚洲国产精品美女| 国产在线一区二区综合免费视频| 亚洲精品第一国产综合精品| 青青草国产免费久久久91| 成人免费777777被爆出| 中文字幕日韩亚洲| 久久九九兔免费精品6| 日韩精品无码免费视频| 亚洲国产综合专区在线电影| 精品一区二区三区免费| 亚洲一区二区三区在线观看蜜桃|