[英]To async, or not to async in node.js?
我仍在學習node.js的繩索,只是想讓我了解應該推遲的工作以及應該執行的工作。
我知道總體上還有其他與此主題有關的問題,但是如果沒有一個更相關的示例,恐怕我會努力做到這一點。
我的一般理解是,如果要執行的代碼很簡單,那么異步異步是個好主意,以免它阻礙其他人的會話。 顯然不止如此,而且回調得到了很多提及,對於為什么您不僅僅同步所有內容,我不是100%的。 我還有一些路要走。
因此,這是我在express.js應用中編寫的一些基本代碼:
app.get('/directory', function(req, res) {
process.nextTick(function() {
Item.
find().
sort( 'date-modified' ).
exec( function ( err, items ){
if ( err ) {
return next( err );
}
res.render('directory.ejs', {
items : items
});
});
});
});
我在這里使用process.nextTick()
正確嗎? 我的理由是,由於它是數據庫調用,因此必須完成一些實際的工作,並且這種事情可能會減慢活動會話的速度。 還是錯了?
其次,我有一種感覺,如果我推遲數據庫查詢,那么它應該在回調中,並且在接收到回調響應的情況下,我應該使實際的頁面呈現同步發生。 我只是假設這是因為,從我所見的一些示例中看,這似乎是更常見的格式-如果這是正確的假設,那么任何人都可以解釋為什么會這樣嗎?
謝謝!
在這種情況下,您使用的是錯誤的,因為.exec()
已經是異步的(您可以通過接受回調作為參數這一事實來判斷)。
公平地說,nodejs中大多數需要異步的已經是。
至於頁面渲染,如果您需要數據庫的結果來渲染頁面,並且結果是異步到達的,則您實際上無法同步渲染頁面。
一般來說,最好的做法是使所有內容都可以異步,而不是依賴同步函數……在大多數情況下,這類似於readFile
與readFileSync
。 在您的示例中,您沒有與I / O同步執行任何操作。 您擁有的唯一同步代碼是程序的邏輯(這需要CPU,因此必須在節點中同步),但相比之下,這些都是很小的事情。
我不確定什么是Item
,但是如果我不得不猜測.find().sort()
作用是在系統內部構建查詢字符串。 在調用.exec
之前,它實際上不會運行查詢(與DB對話)。 .exec
進行回調,因此它將與數據庫異步通信。 通信完成后,將調用回調。
在這種情況下,使用process.nextTick
不會執行任何操作。 這只會延遲其代碼的調用,直到不需要執行的下一個事件循環為止。 它對同步沒有影響。
我不太理解您的第二個問題,但是如果頁面的呈現取決於查詢的結果,則必須推遲頁面的呈現,直到查詢完成為止–您可以通過在回調中進行呈現來實現。 渲染本身的res.render
也可能不完全同步。 這取決於定義render
函數的庫的內部機制。
在您的示例中,未定義next
。 相反,您的代碼應該看起來像:
app.get('/directory', function(req, res) {
Item.
find().
sort( 'date-modified' ).
exec(function (err, items) {
if (err) {
console.error(err);
res.status(500).end("Database error");
}
else {
res.render('directory.ejs', {
items : items
});
}
});
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.