2013-08-02 22 views
13

私はアプリケーションを持っており、特定のルート上では、データベース文書をパラメータとしてres.jsonを呼び出して、データベースからユーザーが応答する関数を呼び出します。私は約束しているライブラリを使用して、私は応答のデータベース文書を置いているコールバックをインライン化したいと思いました。しかし、プログラムは失敗すると失敗します。なぜ誰かが説明できますか?また、console.logへのインラインコールが実際に動作するのはなぜかと思います。 2つの方法の間にいくつかの基本的な違いがありますかres.jsonconsole.logなぜ私はres.jsonを呼び出すことができませんか?

ここでは、動作するものと動作しないものの例を示します。 getUserFromDatabase()がユーザー文書の約束を返すとします。 .thenres親オブジェクトへの参照せずにそれを直接呼び出すので、それをバインドしようとしているので

//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を失う:

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'に依存しています。この状況では迷惑になるかもしれませんが、静的に割り当てることができるため、コンテキストを持つ必要がある関数よりも優れたパフォーマンスを発揮します。レスポンスクラスは自動的にメソッドをバインドすることができますが、 'res.json'がメソッドとして正常に呼び出せる(ほとんどの場合可能です)場合、パフォーマンスが大幅に低下します。 – Esailija

関連する問題