2012-12-05 38 views
6

Tôi muốn sử dụng phương thức JavaScript .apply cho các chức năng của tiết kiệm được biên soạn cho Node.js. Các tập tin tiết kiệm .js có mã như thế này:.được áp dụng mà không thay đổi phạm vi

... 
var NimbusClient = exports.Client = function(output, pClass) { 
    this.output = output; 
    this.pClass = pClass; 
    this.seqid = 0; 
    this._reqs = {}; 
}; 
NimbusClient.prototype = {}; 
NimbusClient.prototype.getClusterInfo = function(callback) { 
    this.seqid += 1; // line where error is thrown [0] 
    this._reqs[this.seqid] = callback; 
    this.send_getClusterInfo(); 
}; 
... 

tập tin máy chủ của tôi trông theo cách sau:

var thrift = require('thrift') 
    , nimbus = require('./Nimbus') 
    , connection = thrift.createConnection('127.0.0.1', 6627) 
    , client = thrift.createClient(nimbus, connection) 
    , ... // server initiation etc 

app.get('/nimbus/:command', function(req, res, next) { 
    client[req.params.command](console.log); // direct call [1] 
    client[req.params.command].apply(this, [console.log]); // apply call [2] 
}); 

... 

Cuộc gọi trực tiếp [1] trả về các giá trị như mong đợi, nhưng áp dụng cuộc gọi [2 ] luôn luôn tạo những lỗi sau đây trong dòng [0]:

TypeError: Cannot set property 'NaN' of undefined 

tôi đã cố gắng một vài thông số phạm vi khác trong [2]: null, nimbus, nimbus.Client, 0.123., nimbus.Client.prototype[req.params.command]client[req.params.command], tất cả đều không thành công.

Làm cách nào tôi có thể gọi phương thức áp dụng mà không thay đổi phạm vi thực tế của hàm được gọi, để nó hoạt động giống hệt như khi được gọi trực tiếp?

+0

thử foo.apply (null, ...) –

+0

foo.apply (null, ...) tạo ra các lỗi tương tự – Thomas

+0

tôi là loại tò mò là tại sao bạn muốn gõ 'apply' phương pháp trong lần đầu tiên đặt nếu bạn muốn giữ lại phạm vi mặc định ... – subhaze

Trả lời

11

Chỉ chức năng apply quay lại cùng chức năng như thế này nên giữ nguyên phạm vi ban đầu.

client[req.params.command].apply(client, [console.log]); 
+1

Đây chính xác là cách [coffeescript biên dịch các mảng ký hiệu là đối số hàm] (http://tinyurl.com/baz8ryz) 'obj.fn (arr ...)' –

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