![](/img/trans.png)
[英]What are the proper use cases for process.nextTick in Node.js?
[英]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.