2015-10-20 19 views
5

Đây là một shot dài, nhưng tôi đã tự hỏi nếu có một điều như C++ std :: ràng buộc trong javascript hoặc node.js? Dưới đây là ví dụ mà tôi cảm thấy sự cần thiết của một ràng buộc:Có tương đương std :: bind trong javascript hoặc node.js không?

var writeResponse = function(response, result) { 
    response.write(JSON.stringify(result)); 
    response.end(); 
} 


app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }); 
}); 

Thay vì đi qua các callback để dbaccesss.exec, tôi muốn vượt qua một con trỏ hàm mang theo một tham số. Trong C++, tôi sẽ vượt qua điều này:

std::bind(writeResponse, res) 

Điều này sẽ dẫn đến một hàm có một tham số ('kết quả' trong trường hợp của tôi), mà tôi có thể chuyển thay vì gọi lại ẩn danh. Ngay bây giờ tôi đang sao chép tất cả mã đó trong chức năng ẩn danh cho mọi tuyến đường trong ứng dụng tốc hành của tôi.

+1

[Function.prototype.bind] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)? – Oka

Trả lời

4

Trong khi nó tồn tại, tôi muốn được thêm nghiêng để làm điều đó với một kết thúc:

function writeResponse(res) { 

    return function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }; 
} 
// and then... 
dbaccess.exec(query, writeResponse(res)); 
+0

Điều này thật tuyệt vời, cảm ơn bạn. Tôi cũng thấy nó dễ đọc hơn là sử dụng bind. – cocheci

-1

Nó tồn tại, có hai phương pháp. Callapply hơi khác một chút.

Có phương pháp bind, nhưng nó thực hiện một việc khác (thay đổi giá trị this khi gọi hàm).

Không có một điều như một 'con trỏ hàm' Tôi nghĩ rằng những gì bạn cần ở đây là currying:

function currier(that, fn) { 
    var args = [].slice.call(arguments, 2); 

    return function() { 
    return fn.apply(that, args); 
    } 
} 
+0

Điều đó dường như không phải là điều mà OP mong muốn. Và bạn có thể chuyển các hàm trong JS, các hàm là các đối tượng và tất cả các đối tượng được truyền qua tham chiếu. –

+0

"truyền con trỏ hàm nhận một tham số" âm thanh với tôi như anh ta muốn tạo ra một hàm từ một sự đóng cửa –

+0

@LuisSieira Có vẻ như chúng không hiểu thuật ngữ thích hợp để sử dụng khi mô tả các hàm trong JavaScript. – Oka

3

Nếu tôi hiểu rõ những gì bạn đang cố gắng để làm, tôi phải để trỏ đến Function.prototype.bind phương pháp. Nó hoạt động như bạn mô tả:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, writeResponse.bind(null, res)); 
}); 
+0

Thực ra đó là những gì tôi đang tìm kiếm, mặc dù có vẻ như bạn nên chuyển 'undefined' chứ không phải là' null'? – cocheci

+1

Nó giống như một quy ước hơn là một quy tắc, nhưng nếu bạn đang truyền đối tượng null, bạn có thể nói: đối số đó sẽ là 'không có gì'. – Microfed

1

Không chắc chắn nếu họ đang hỗ trợ trong NodeJS nêu ra, nhưng nếu vì vậy, bạn cũng có thể sử dụng chức năng mũi tên chất béo một cách dễ dàng đủ.

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, r => writeResponse(res, r)) 
}); 

Chúng cũng giữ nguyên giá trị từ vựng this, điều này rất hay khi cần.

Đó là tương đương với điều này:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(r) { 
     return writeResponse(res, r); 
    }) 
}); 

mặc dù cái này có this xác định bởi .exec().

+0

Thật vậy, nó cũng hoạt động, cảm ơn bạn. – cocheci

3

Mặc dù hơi khác so với chức năng bind như được tìm thấy trong STL, bạn có thể sử dụng <function>.bind, đó là một phần của nguyên mẫu của hàm trong JavaScript.

Phương pháp bind trả về một vừa tạo function đối tượng (đừng quên rằng function s là công dân đầu tiên trong JavaScript và đang xây dựng bắt đầu từ Function nguyên mẫu) chấp nhận N trừ M tham số (trong JavaScript đây là một ràng buộc yếu thực sự, nó sẽ bao giờ chấp nhận nhiều tham số khi bạn vượt qua nó, nhưng không có đảm bảo rằng chúng sẽ được sử dụng), trong đó N là số tham số được chấp nhận ban đầu, trong khi M là các tham số bị ràng buộc.

Sự khác biệt chính là bind cũng chấp nhận như là đối số đầu tiên một phạm vi đối tượng đó sẽ có sẵn từ bên trong hàm mới được tạo ra chính nó như là this tham khảo, vì vậy bạn có nghĩa là có thể thay đổi và tiêm this tài liệu tham khảo trong quá trình thực hiện.

Here bạn có thể tìm tài liệu của bind.

Như đã đề cập bởi ai đó, bạn cũng có thể dựa trên đóng cửa để đạt được mục tiêu của mình trong hầu hết các trường hợp bạn có thể sử dụng liên kết.

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