2012-12-05 7 views
6

Chcę użyć metody JavaScript .apply do funkcji kompilacji skompilowanej dla Node.js. Plik .js Thrift ma kod tak:.apply bez zmiany zakresu

... 
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(); 
}; 
... 

Mój plik server wygląda w następujący sposób:

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] 
}); 

... 

Bezpośrednie połączenia [1] zwraca wartości zgodnie z oczekiwaniami, ale wywołanie zastosowania [2 ] zawsze produkuje następujący błąd w wierszu [0]:

TypeError: Cannot set property 'NaN' of undefined 

próbowałem kilka parametrów inny zakres w [2]: null, nimbus, nimbus.Client, nimbus.Client.prototype, i client[req.params.command], wszystkie bez powodzenia.

Jak wywołać metodę apply bez zmiany rzeczywistego zakresu wywoływanej funkcji, aby zachowywała się dokładnie tak samo, jak w przypadku bezpośredniego wywoływania?

+0

spróbować foo.apply (null, ...) –

+0

foo.apply (null, ...) produkuje ten sam błąd – Thomas

+0

Jestem trochę ciekaw, dlaczego chcesz używać 'apply' metodę w pierwszym miejsce, jeśli chcesz zachować domyślny zakres ... – subhaze

Odpowiedz

11

Wskazując funkcję apply z powrotem do tej samej funkcji, należy zachować oryginalny zakres.

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

To jest dokładnie jak [coffeescript kompiluje tablice jako argumenty funkcji] (http://tinyurl.com/baz8ryz) 'obj.fn (arr ...)' –