2013-08-02 12 views
13

Mam aplikację i expressjs i na określonej trasie wywołuję funkcję, która odpowiada użytkownikowi z bazy danych, wywołując res.json z dokumentem bazy danych jako parametrem. Korzystam z bibliotek opartych na obietnicach i chciałem wstawić wywołanie zwrotne, w którym umieszczam dokument bazy danych w odpowiedzi. Ale program się nie powiedzie, kiedy to zrobię. Czy ktoś może wyjaśnić, dlaczego? Zastanawiam się także, dlaczego połączenia inlined do console.log faktycznie działają. Czy istnieje pewna zasadnicza różnica między tymi dwoma metodami: res.json i console.log?Dlaczego nie mogę wywołać inline wywołania res.json?

Oto przykład tego, co działa, a co nie działa. Załóżmy, że getUserFromDatabase() zwraca obietnicę dokumentu użytkownika.

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

Wygląda wiążący problem. http://alistapart.com/article/getoutbindingsituations – randunel

Odpowiedz

12

Funkcja json traci poprawny this wiążące przy stosowaniu tak ponieważ .then zamierza powołać go bezpośrednio, bez odniesienia do obiektu res dominującej, więc wiążą go:

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

Czy można to uznać za lukę w bibliotece, czy też nie da się tego obejść podczas projektowania obiektu res? –

+0

Tak działa JavaScript. Funkcja 'res.json' może być wstępnie powiązana z biblioteką, ale jest to bardzo niekonwencjonalne w javascript. CoffeeScript pozwala na wstępne wiązanie metod obiektowych za pomocą operatora strzałki grubej ("=>"), FYI. –

+0

@RudwigMagnusson 'res.json' nie jest funkcją, ale metodą - co oznacza, że ​​jest zależne od' this'. Chociaż może to być denerwujące w tej sytuacji, działa znacznie lepiej niż funkcje, które muszą przenosić swój kontekst z nimi, ponieważ mogą być statycznie przydzielone. Klasa "Response" może automatycznie wiązać swoje metody, ale jest to ogromna strata wydajności, gdy 'res.json' może być wywołany normalnie jako metoda (najczęściej może). – Esailija

Powiązane problemy