2013-08-02 106 views
13

我有和expressjs應用程序,並在特定的路線上調用res.json與數據庫文檔作爲參數與數據庫中的用戶響應的函數。我使用基於promise的庫,並且想要將回調中的數據庫文檔放在回調中。但是,當我這樣做時,程序就會失敗。有人可以解釋爲什麼嗎?我也想知道爲什麼內聯調用console.log確實有效。兩種方法res.jsonconsole.log之間有一些根本的區別嗎?爲什麼不能直接調用res.json?

下面是一個什麼工作,什麼不工作的例子。假設getUserFromDatabase()返回用戶文檔的承諾。

//This works 
var getUser = function(req, res) { 
    getUserFromDatabase().then(function(doc) { 
     res.json(doc); 
    });  
} 

//This does not work (the server never responds to the request) 
var getUserInline = function(req, res) { 
    getUserFromDatabase().then(res.json);  
} 

//This works (the object is printed to the console) 
var printUser = function(req, res) { 
    getUserFromDatabase().then(console.log);  
} 
+0

它看起來像一個結合問題。 http://alistapart.com/article/getoutbindingsituations – randunel

回答

12

json功能失去其正確this像在使用時結合因爲.then將要調用它的情況下直接參考res父對象,所以將其綁定:

var getUserInline = function(req, res) { 
    getUserFromDatabase().then(res.json.bind(res));  
} 
+0

這可能被認爲是庫中的缺陷,或者在設計res對象時沒有辦法繞過它嗎? –

+0

這就是JavaScript的工作原理。 'res.json'函數可以被庫預先綁定給你,但這在javascript中會非常不合常規。 CoffeeScript允許使用胖箭頭(「=>」)操作符FYI的預綁定面向對象方法。 –

+0

@LudwigMagnusson'res.json'不是一個函數,而是一個方法 - 這意味着它依賴於'this'。雖然在這種情況下它可能很煩人,但它比需要將它們與上下文相關聯的函數執行得更好,因爲它可以進行靜態分配。 'Response'類可以自動綁定它的方法,但是當'res.json'可以被正常調用作爲一種方法時(通常它可以),這是一個巨大的性能損失。 – Esailija

相關問題