簡體   English   中英

要異步,還是不異步在node.js中?

[英]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中大多數需要異步的已經是。

至於頁面渲染,如果您需要數據庫的結果來渲染頁面,並且結果是異步到達的,則您實際上無法同步渲染頁面。

一般來說,最好的做法是使所有內容都可以異步,而不是依賴同步函數……在大多數情況下,這類似於readFilereadFileSync 在您的示例中,您沒有與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.

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