老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Node.js中怎么使用Hooks實現異步

本篇文章為大家展示了Node.js中怎么使用Hooks實現異步,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

十多年的商水網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整商水建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“商水網站設計”,“商水網站推廣”以來,每個客戶項目都認真落實執行。

API使用

我總是覺得官方文檔過于復雜以及苛刻。這就是為什么我通常會選擇傳統、友好的博客文章。

讓我們首先了解一下Async Hooks API提供的 5 個可用事件函數:

  •  init: 顧名思義,當特定的異步資源初始化時會調用它。僅作記錄,此時,我們已經將鉤子與異步資源相關聯。

  •  before 和 after: 這與普通語言中的函數的執行前和執行后非常相似。在資源執行之前和之后分別調用它們。

  •  destroy: 很明顯,無論資源的回調函數發生了什么,只要資源被銷毀就會調用它。

  •  promiseResolve: promiseResolve與Promise有關,當你的Promise調用它的 resolve 函數時,掛鉤就會觸發此函數。

非常的簡單直接,接下來讓我們看一個基本的例子:

const myFirstAsyncHook = async_hooks.createHook({ init, before, after, destroy, promiseResolve });

是的,你必須先創建每個事件函數,然后再將其分配給createHook函數。另外,必須顯式啟用該掛鉤:

myFirstAsyncHook.enable();

讓我們繼續看一個更加完整的例子:

const fs = require("fs");  const async_hooks = require("async_hooks");  // Sync write to the console  const writeSomething = (phase, more) => {     fs.writeSync(        1,        `Phase: "${phase}", Exec. Id: ${async_hooks.executionAsyncId()} ${              more ? ", " + more : ""          }\n`     ); };  // Create and enable the hook  const timeoutHook = async_hooks.createHook({     init(asyncId, type, triggerAsyncId) {        writeSomething(           "Init",           `asyncId: ${asyncId}, type: "${type}", triggerAsyncId: ${triggerAsyncId}`       );     },     before(asyncId) {        writeSomething("Before", `asyncId: ${asyncId}`);     },     destroy(asyncId) {        writeSomething("Destroy", `asyncId: ${asyncId}`);     },     after(asyncId) {        writeSomething("After", `asyncId: ${asyncId}`);     },  });  timeoutHook.enable();  writeSomething("Before call");  // Set the timeout  setTimeout(() => {     writeSomething("Exec. Timeout");  }, 1000);

這個例子通過眾所周知的原生函數 setTimeout 去追蹤超時的異步執行過程。

在我們深入研究之前,先快速瀏覽一下第一個函數 writeSomething 。你也許很好奇為什么在我們已經有函數可以在控制臺輸出的情況下仍然創建了一個新的函數去完成相同的功能。

原因是你不能使用任何 console 函數去測試異步鉤子,因為它們本身就是異步的。因此當我們在下面提供了一個 init 函數時,它會產生一個無限循環。該函數會調用 console 的 log ,此日志又會再次觸發初始化,以此類推,陷入死循環。

這就是為什么我們需要重新寫一個“同步”日志功能。

好了,現在我們回過頭去看代碼。我們的異步鉤子提供了四個功能:init、 before、 after 以及 destory。而且,我們還在超時之前和執行期間打印一條消息,所以你可以看到整個過程是如何線性進行的。

在你的命令行執行 node index.js,你會得到如下圖所示的結果:

Node.js中怎么使用Hooks實現異步

觀察下鉤子是如何一步一步執行追蹤的。看起來是一種很有趣的跟蹤方式,尤其是當你考慮將數據輸入到監視工具中或者是你已經使用的日志追蹤工具。

一個Promise例子

讓我們看看我們的示例在Promise下的執行效果。思考下面這些代碼片段:

const calcPow = async(n, exp) => {     writeSomething("Exec. Promise");     return Math.pow(n, exp);  };  (async() => {     await calcPow(3, 4);  })();

你也可以用之前的 setTimeout 示例來替代這個例子。在這段代碼中,我們有一個異步函數用來進行冪運算。同時也有一個相同的函數在異步塊中被調用。到目前為止,Node.js創建了兩個Promise。

下圖是日志記錄的結果:

Node.js中怎么使用Hooks實現異步

奇怪的是,我們有兩個Promise,卻調用了三次 init 函數。不用擔心,這是因為Node.js團隊在版本12中引入了異步執行性能方面的一些最新改進。你可以點擊此處[4]了解更多信息。

盡管如此,執行過程依然符合我們的預期。

解析:鉤子函數的性能與度量

Node.js提供的另一個非常有趣的API是性能評估API[5],既然我們在這里討論度量,為什么不結合兩者的功能來了解我們可以收獲什么呢?

可以通過 perf_hooks 獲得該API,該API讓我們能夠用與W3C Web Performance API[6]相似的方式來獲得性能/用戶時間軸指標。

將它與異步鉤子相結合我們可以做一些事情,比如追蹤異步函數執行完畢需要的時間。讓我們看另外一個例子:

const async_hooks = require("async_hooks");  const {     performance,     PerformanceObserver  } = require("perf_hooks");  const hook = async_hooks.createHook({     init(asyncId) {        performance.mark(`init-${asyncId}`);     },     destroy(asyncId) {        performance.mark(`destroy-${asyncId}`);        performance.measure(           `entry-${asyncId}`,           `init-${asyncId}`,           `destroy-${asyncId}`        );     },  });  hook.enable();  const observer = new PerformanceObserver((data) =>     console.log(data.getEntries())  );  observer.observe({     entryTypes: ["measure"],     buffered: true  });  setTimeout(() => {     console.log("I'm a timeout");  }, 1200);

既然我們只是追蹤記錄執行時間,就沒有必要用之前用的中間事件函數。用 init 和 destroy 就足夠了。

就像異步鉤子那樣,性能API通過創建觀察者來工作。不過,無論什么時候開始或者結束,你都必須明確標記每個事件的id。這樣,當我們調用API的 measure 函數時,它將匯總收集到的數據并將其立即發送給觀察者,觀察者將為我們記錄全部的日志。

注意了,這里我們使用了兩次 console.log 函數。第一次是無影響的因為它包含在觀察者中執行。但是第二次它在 setTimeout 函數中執行,另一個異步中的異步,這意味著在最后它會產生不同的輸出。

下圖是日志記錄:

Node.js中怎么使用Hooks實現異步

本示例本并沒有考慮事件類型之間的差異。在這里,我們在同一測量場景中發生了超時和異步日志操作。

但是,考慮到生產環境,建議你創建一個更強大的機制在每次調用 init 時存儲事件類型,并在稍后調用 destroy 函數,倒霉的沒有接收到參數類型時檢查存儲是否依然存在。

異步資源

Async Hooks中的另一個有用功能是 `AsyncResource`[7] 類。每當你為框架或庫創建自己的資源時,它都會為你提供幫助。

只需輸入以下代碼即可使用:

const AsyncResource = require('async_hooks').AsyncResource;

用這種方式,你可以使用它實例化一個新對象,并手動定義其每個階段在整個代碼中何時開始。舉個例子:

const resource = new AsyncResource('MyOwnResource');  someFunction(function someCallback() {     resource.emitBefore();     // do your stuff...     resource.emitAfter();  });  someOnClose() {     resource.emitDestroy();  }

上述內容就是Node.js中怎么使用Hooks實現異步,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。


本文題目:Node.js中怎么使用Hooks實現異步
網站鏈接:http://www.xueling.net.cn/article/iggogg.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 精品超清无码视频在线观看 | www.波多野结衣.com | 国产精品美女久久久浪潮av | 国产精品美女黄网 | 国产人妻人伦精品无码.麻豆 | 夫妻的情妇在线观看 | 日本字幕在线观看 | 国产成人亚洲综合一区 | a在线视频播放观看免费观看 | 天堂资源在线观看免费高清视频 | 11nvnv女女网导航永久 | 欧美高清在线一区二区 | 亚洲一区精品无码 | 亚洲区中文字幕 | 娇喘潮喷抽搐高潮视频 | 91成人精品爽啪在线观看 | 久久久激情视频 | 色花堂国产精品第一页 | 妺妺窝人体色WWW聚色窝 | 人妻内射一区二区在线视频 | 91麻豆久久 | 在线不卡a资源高清 | 毛片公司 | 日本午夜精品视频 | 成人久久视频 | 国产精品va无码二区 | 国产一区二区三区在线免费看 | 九九一级片 | 国产亚洲欧美日韩在线爱豆 | 99热国内精品 | 麻豆一级视频 | 欧美精品在线不卡 | 成人涩涩涩视频在线观看 | 午夜在线视频一区二区三区 | 欧美日韩不卡在线视频 | 国产又粗又黄又爽又硬的软件 | 哪里有免费的黄色网址 | 无码99久热这里只有精品视频在线 | 日韩一区二区三区色 | 免费三区| 久久久爽爽爽美女图片 |