2013-08-02 32 views
13

Tôi có và ứng dụng expressjs và trên một tuyến đường cụ thể tôi gọi một chức năng đáp ứng với một người dùng từ cơ sở dữ liệu bằng cách gọi res.json với tài liệu cơ sở dữ liệu làm tham số. Tôi sử dụng thư viện dựa trên lời hứa và tôi muốn nội tuyến cuộc gọi lại nơi tôi đang đặt tài liệu cơ sở dữ liệu trong phản hồi. Nhưng chương trình không thành công khi tôi làm như vậy. Ai đó có thể giải thích tại sao? Tôi cũng tự hỏi tại sao các cuộc gọi nội tuyến đến console.log thực sự hoạt động. Có một số khác biệt cơ bản giữa hai phương thức res.jsonconsole.log không?Tại sao tôi không thể gọi nội dòng đến res.json?

Dưới đây là ví dụ về những gì hiệu quả và những gì không hiệu quả. Giả sử getUserFromDatabase() trả về lời hứa của tài liệu người dùng.

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

Nó trông giống như một ràng buộc vấn đề. http://alistapart.com/article/getoutbindingsituations – randunel

Trả lời

12

Chức năng json mất nó đúng this ràng buộc khi được sử dụng như thế kể từ khi .then sẽ gọi nó trực tiếp mà không cần tham chiếu đến đối tượng res cha mẹ, vì vậy bind nó:

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

Điều này có thể được coi là một lỗ hổng trong thư viện hay không có cách nào xung quanh nó khi thiết kế đối tượng res? –

+0

Đây chỉ là cách JavaScript hoạt động. Hàm 'res.json' có thể được thư viện ràng buộc trước cho bạn nhưng điều đó sẽ rất độc đáo trong javascript. CoffeeScript cho phép các phương pháp hướng đối tượng trước ràng buộc với toán tử mũi tên chất béo ("=>"), FYI. –

+0

@LudwigMagnusson 'res.json' không phải là hàm mà là phương thức - điều đó có nghĩa là nó phụ thuộc vào' this'. Trong khi nó có thể gây phiền nhiễu trong tình huống này, nó thực hiện tốt hơn nhiều so với các hàm cần mang theo ngữ cảnh của chúng với chúng bởi vì nó có thể được phân bổ tĩnh. Lớp 'Response' có thể tự động liên kết các phương thức của nó nhưng đó là một sự mất mát hiệu suất rất lớn khi' res.json' có thể được gọi bình thường như một phương thức (thường xuyên nhất nó có thể). – Esailija

Các vấn đề liên quan