2013-08-02 15 views
13

Uyguladığım ve belirli bir rotada, veritabanı belgesine parametre olarak res.json numaralı telefonu arayarak veritabanından bir kullanıcı ile yanıt veren bir işlevi çağırıyorum. Sözü temelli kütüphaneleri kullanıyorum ve veritabanı belgesini cevabın içine soktuğum geri bildirimi satır içine almak istedim. Ama program bunu yaptığımda başarısız oluyor. Birisi nedenini açıklayabilir mi? Ayrıca, neden console.log numaralı telefona yapılan çağrıların aslında işe yaradığını merak ediyorum. İki yöntem res.json ve console.log arasındaki bazı temel fark var mı?Neden res.json'a satır içi çağrı yapılamıyor?

İşte neyin işe yarayıp neyin işe yaramadığını gösteren bir örnek. getUserFromDatabase()'un bir kullanıcı belgesinin sözünü döndürdüğünü varsayalım.

//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

bir bağlayıcı benziyor sorun. http://alistapart.com/article/getoutbindingsituations – randunel

cevap

12

json fonksiyon kaybeder onun doğru this böyle kullanıldığında bağlama .then birleştirmiş, böylece doğrudan res üst nesnenin referans olmadan çağırmak için gidiyor beri:

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

Bu, kütüphanede bir kusur olarak düşünülebilir mi yoksa res nesnesini tasarlarken bunun etrafından dolaşmanın bir yolu yok mu? –

+0

Bu, JavaScript'in nasıl çalıştığıdır. 'Res.json' işlevi sizin için kütüphane tarafından önceden bağlanmış olabilir, ancak bu javascriptte çok sıra dışı olurdu. CoffeeScript, yağ ok ("=>") operatörü, FYI ile önceden bağlayıcı nesne yönelimli yöntemlere izin verir. –

+0

@LudwigMagnusson 'res.json' bir işlev değil, bir yöntem - bu 'buna bağlı' anlamına gelir. Bu durumda rahatsız edici olsa da, statik olarak tahsis edilebileceğinden, bağlamlarını kendileriyle taşıması gereken işlevlerden çok daha iyi performans gösterir. Response (Yanıt) sınıfı, kendi yöntemlerini otomatik olarak bağlayabilir, ancak 'res.json' (normalde bir yöntem olarak) (normalde bir yöntem olarak) normal olarak çağrılabildiğinde bu büyük bir performans kaybıdır. – Esailija