簡體   English   中英

Node.js 異步函數,process.nextTick()

[英]Node.js asynchronous function, process.nextTick()

我正在編寫一個節點后端,我有點困惑我應該如何處理異步函數。 我已經閱讀了 process.nextTick(),但我應該多久使用一次。 我的大部分代碼都基於回調,比如數據庫調用,它們本身是異步的。 但我也有一些自己的功能,應該是異步的。

那么哪一個是異步函數的一個很好的例子呢?

function validateUser1(user, callback) {

  process.nextTick(function() {    

     //validate user, some regex and stuff

     callback(err, user);

  });

}

function validateUser2(user, callback) {

  //validate user, some regex and stuff

  process.nextTick(callback, err, user);

}

function validateUser3(user, callback) {

  process.nextTick(function() {    

    //validate user, some regex and stuff

    process.nextTick(callback, err, user);

  });

}

我不知道我是否應該將所有內容都包裝在 process.nextTick 中,還是只包裝回調? 或兩者?

總的來說,node.js 的想法是編寫許多小函數而不是大函數,並異步調用它們以不阻塞其他事件,對嗎?

如果您只有 CPU 代碼(沒有 I/O),您應該盡可能地嘗試。 避免異步和微小的函數,它們會不必要地分割您的代碼。

抓住機會,盡可能編寫干凈、可讀、線性的代碼。 僅在絕對必要時才恢復為異步,例如流 I/O(文件或網絡)。

考慮一下。 即使你有 1000 多行 JS 代碼,它仍然會以極快的速度執行。 你真的不需要把它碎片化(除非證明太麻煩,比如很深的循環,但你必須先測量它)!

如果您不首先測試線性代碼並實際看到您需要對其進行分段,那么您最終會過早地進行優化,這對可維護性來說是一件壞事。

我真的會直接這樣做:

function validateUser1(user, callback) {
   //validate user, some regex and stuff
   callback(err, user);
}

如果可能,請完全刪除該函數(但這取決於您如何編寫其余代碼)。

另外,如果您真的不需要,請不要使用nextTick() 我已經實現了許多TCP / IP套接字,數據庫連接,記錄,文件閱讀和大量的I / O的雲服務器,卻一次沒有做過我用nextTick()它運行很平滑

process.nextTick() 將在繼續事件循環之前執行您的回調。 如果您傳遞給 process.nextTick() 的回調是 CPU 昂貴的東西,例如加密、計算 PI 等,這將阻止您的線程並可以停止處理傳入的連接。

據我所知,您試圖通過將函數傳遞給 process.nextTick() 來使函數異步。 這不是它的工作原理。 當您將某些內容傳遞給 process.nextTick() 時,它將在下次執行 eventloop 之前執行。 這不會使您的函數成為非阻塞的,因為您執行的函數仍在主線程中運行。 只有 I/O 操作可以是非阻塞的。

因此,如果你用 process.nextTick() 包裝你的 CPU 密集型函數或直接執行它們是無關緊要的。

如果你想閱讀更多背景信息,這里是資源: https : //nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick

我仍然對提供的答案感到困惑。 我在 Lynda.com 上觀看了有關 NodeJS(高級 NodeJS)的短期課程。 這家伙提供了以下使用 process.nextTick() 的示例

function hideString(str, done) {
    process.nextTick(()=> {
        done(str.replace(/[a-zA-Z]/g, 'X'))
    })

}

hideString("Hello World", (hidden) => {
    console.log( hidden );
});

console.log('end')

如果不使用,console.log('end') 會先打印出來。 不是異步的。 我理解為編寫異步代碼,您將需要 process.nextTick。 不清楚如何在沒有 process.next Tick() 的前端用 JS 編寫異步代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM