最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Node.JS模塊 process

 更新時間:2020年08月31日 07:13:28   作者:心譚博客  
這篇文章主要介紹了Node.JS模塊 process的相關(guān)資料,幫助大家更好的理解和學習node.js,感興趣的朋友可以了解下

process 模塊是 nodejs 提供給開發(fā)者用來和當前進程交互的工具,它的提供了很多實用的 API。從文檔出發(fā),管中窺豹,進一步認識和學習 process 模塊:

  • 如何處理命令參數(shù)?
  • 如何處理工作目錄?
  • 如何處理異常?
  • 如何處理進程退出?
  • process 的標準流對象
  • 深入理解 process.nextTick

如何處理命令參數(shù)?

命令行參數(shù)指的是 2 個方面:

  • 傳給 node 的參數(shù)。例如 node --harmony script.js --version 中,--harmony 就是傳給 node 的參數(shù)
  • 傳給進程的參數(shù)。例如 node script.js --version --help 中,--version --help 就是傳給進程的參數(shù)

它們分別通過 process.argvprocess.execArgv 來獲得。

如何處理工作目錄?

通過process.cwd()可以獲取當前的工作目錄。

通過process.chdir(directory)可以切換當前的工作目錄,失敗后會拋出異常。實踐如下:

function safeChdir(dir) {
 try {
  process.chdir(dir);
  return true;
 } catch (error) {
  return false;
 }
}

如何處理異常?

uncaughtException 事件

Nodejs 可以通過 try-catch 來捕獲異常。如果異常未捕獲,則會一直從底向事件循環(huán)冒泡。如是冒泡到事件循環(huán)的異常沒被處理,那么就會導致當前進程異常退出。

根據(jù)文檔,可以通過監(jiān)聽 process 的 uncaughtException 事件,來處理未捕獲的異常:

process.on("uncaughtException", (err, origin) => {
 console.log(err.message);
});

const a = 1 / b;
console.log("abc"); // 不會執(zhí)行

上面的代碼,控制臺的輸出是:b is not defined。捕獲了錯誤信息,并且進程以0退出。開發(fā)者可以在 uncaughtException 事件中,清除一些已經(jīng)分配的資源(文件描述符、句柄等),不推薦在其中重啟進程。

unhandledRejection 事件

如果一個 Promise 回調(diào)的異常沒有被.catch()捕獲,那么就會觸發(fā) process 的 unhandledRejection 事件:

process.on("unhandledRejection", (err, promise) => {
 console.log(err.message);
});

Promise.reject(new Error("錯誤信息")); // 未被catch捕獲的異常,交由unhandledRejection事件處理

warning 事件

告警不是 Node.js 和 Javascript 錯誤處理流程的正式組成部分。 一旦探測到可能導致應(yīng)用性能問題,缺陷或安全隱患相關(guān)的代碼實踐,Node.js 就可發(fā)出告警。

比如前一段代碼中,如果出現(xiàn)未被捕獲的 promise 回調(diào)的異常,那么就會觸發(fā) warning 事件。

如何處理進程退出?

process.exit() vs process.exitCode

一個 nodejs 進程,可以通過 process.exit() 來指定退出代碼,直接退出。不推薦直接使用 process.exit(),這會導致事件循環(huán)中的任務(wù)直接不被處理,以及可能導致數(shù)據(jù)的截斷和丟失(例如 stdout 的寫入)。

setTimeout(() => {
 console.log("我不會執(zhí)行");
});

process.exit(0);

正確安全的處理是,設(shè)置 process.exitCode,并允許進程自然退出。

setTimeout(() => {
 console.log("我不會執(zhí)行");
});

process.exitCode = 1;

beforeExit 事件

用于處理進程退出的事件有:beforeExit 事件 和 exit 事件。

當 Node.js 清空其事件循環(huán)并且沒有其他工作要安排時,會觸發(fā) beforeExit 事件。例如在退出前需要一些異步操作,那么可以寫在 beforeExit 事件中:

let hasSend = false;
process.on("beforeExit", () => {
 if (hasSend) return; // 避免死循環(huán)

 setTimeout(() => {
  console.log("mock send data to serve");
  hasSend = true;
 }, 500);
});

console.log(".......");
// 輸出:
// .......
// mock send data to serve

注意:在 beforeExit 事件中如果是異步任務(wù),那么又會被添加到任務(wù)隊列。此時,任務(wù)隊列完成所有任務(wù)后,又回觸發(fā) beforeExit 事件。因此,不處理的話,可能出現(xiàn)死循環(huán)的情況。如果是顯式調(diào)用 exit(),那么不會觸發(fā)此事件。

exit 事件

在 exit 事件中,只能執(zhí)行同步操作。在調(diào)用 ‘exit' 事件監(jiān)聽器之后,Node.js 進程將立即退出,從而導致在事件循環(huán)中仍排隊的任何其他工作被放棄。

process 的標準流對象

process 提供了 3 個標準流。需要注意的是,它們有些在某些時候是同步阻塞的(請見文檔)。

  • process.stderr:WriteStream 類型,console.error的底層實現(xiàn),默認對應(yīng)屏幕
  • process.stdout:WriteStream 類型,console.log的底層實現(xiàn),默認對應(yīng)屏幕
  • process.stdin:ReadStream 類型,默認對應(yīng)鍵盤輸入

下面是基于“生產(chǎn)者-消費者模型”的讀取控制臺輸入并且及時輸出的代碼:

process.stdin.setEncoding("utf8");

process.stdin.on("readable", () => {
 let chunk;
 while ((chunk = process.stdin.read()) !== null) {
  process.stdout.write(`>>> ${chunk}`);
 }
});

process.stdin.on("end", () => {
 process.stdout.write("結(jié)束");
});

關(guān)于事件的含義,還是請看stream 的文檔

深入理解 process.nextTick

我第一次看到 process.nextTick 的時候是比較懵的,看文檔可以知道,它的用途是:把回調(diào)函數(shù)作為微任務(wù),放入事件循環(huán)的任務(wù)隊列中。但這么做的意義是什么呢?

因為 nodejs 并不適合計算密集型的應(yīng)用,一個進程就一個線程,在當下時間點上,就一個事件在執(zhí)行。那么,如果我們的事件占用了很多 cpu 時間,那么之后的事件就要等待非常久。所以,nodejs 的一個編程原則是盡量縮短每一個事件的執(zhí)行事件。process.nextTick 的作用就在這,將一個大的任務(wù)分解成多個小的任務(wù)。示例代碼如下:

// 被拆分成2個函數(shù)執(zhí)行
function BigThing() {
 doPartThing();

 process.nextTick(() => finishThing());
}

在事件循環(huán)中,何時執(zhí)行 nextTick 注冊的任務(wù)呢?請看下面的代碼:

setTimeout(function() {
 console.log("第一個1秒");
 process.nextTick(function() {
  console.log("第一個1秒:nextTick");
 });
}, 1000);

setTimeout(function() {
 console.log("第2個1秒");
}, 1000);

console.log("我要輸出1");

process.nextTick(function() {
 console.log("nextTick");
});

console.log("我要輸出2");

輸出的結(jié)果如下,nextTick 是早于 setTimeout:

我要輸出1
我要輸出2
nextTick
第一個1秒
第一個1秒:nextTick
第2個1秒

在瀏覽器端,nextTick 會退化成 setTimeout(callback, 0)。但在 nodejs 中請使用 nextTick 而不是 setTimeout,前者效率更高,并且嚴格來說,兩者創(chuàng)建的事件在任務(wù)隊列中順序并不一樣(請看前面的代碼)。

以上就是詳解Node.JS模塊 process的詳細內(nèi)容,更多關(guān)于Node.JS模塊 process的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Express + Node.js實現(xiàn)登錄攔截器的實例代碼

    Express + Node.js實現(xiàn)登錄攔截器的實例代碼

    本篇文章主要介紹了Express + Node.js實現(xiàn)攔截器的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法

    Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法

    這篇文章主要介紹了Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 詳解如何在Node.js中實現(xiàn)HTTP/2推送信息

    詳解如何在Node.js中實現(xiàn)HTTP/2推送信息

    HTTP/2 是一種現(xiàn)代化的網(wǎng)絡(luò)協(xié)議,它引入了多路復用、頭部壓縮和服務(wù)器推送等特性,其中,服務(wù)器推送允許服務(wù)器在客戶端請求資源時,主動推送額外的資源,提升頁面加載速度,下面將介紹如何在 Node.js 中實現(xiàn) HTTP/2 推送信息,需要的朋友可以參考下
    2024-12-12
  • Windows上node.js的多版本管理工具用法實例分析

    Windows上node.js的多版本管理工具用法實例分析

    這篇文章主要介紹了Windows上node.js的多版本管理工具用法,結(jié)合實例形式分析了Windows平臺上node.js多版本管理工具nvm-windows的相關(guān)使用技巧,需要的朋友可以參考下
    2019-11-11
  • 使用nodejs下載風景壁紙

    使用nodejs下載風景壁紙

    本文主要介紹了使用nodejs下載風景壁紙的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • node.js中的querystring.stringify方法使用說明

    node.js中的querystring.stringify方法使用說明

    這篇文章主要介紹了node.js中的querystring.stringify方法使用說明,本文介紹了querystring.stringify的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中的fs.lstat方法使用說明

    node.js中的fs.lstat方法使用說明

    這篇文章主要介紹了node.js中的fs.lstat方法使用說明,本文介紹了fs.lstat的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js模塊化原理與應(yīng)用詳細介紹

    Node.js模塊化原理與應(yīng)用詳細介紹

    本篇文章我們將進入我們的模塊化學習,node的模塊化正是node的最大特點,能夠幫住我們將繁瑣的復雜代碼變成一個個的小模塊,便于引用
    2022-09-09
  • 我的Node.js學習之路(一)

    我的Node.js學習之路(一)

    這是一篇專門Node.js初學者學習筆記。該筆記將通過具體實例,教你一步步開始Node.js之旅。
    2014-07-07
  • NodeJS有難度的面試題(能答對幾個)

    NodeJS有難度的面試題(能答對幾個)

    這篇文章主要介紹了NodeJS有難度的面試題(能答對幾個),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10

最新評論

东丰县| 百色市| 宁乡县| 泸水县| 揭东县| 杭锦旗| 临城县| 集安市| 嘉义市| 雷山县| 利川市| 镇沅| 邵东县| 黄山市| 绥芬河市| 朔州市| 大新县| 呼玛县| 门头沟区| 高台县| 府谷县| 德安县| 沙雅县| 南丹县| 阜平县| 赣州市| 彰化县| 鱼台县| 郓城县| 清水河县| 农安县| 凯里市| 山东省| 夹江县| 兴业县| 巴南区| 甘泉县| 大田县| 措勤县| 陇南市| 南充市|