6

Node.js 用にコンパイルされた thrift の関数に JavaScript の .apply メソッドを使用したいと考えています。thrift .js ファイルには、次のようなコードがあります。

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

私のサーバーファイルは次のようになります。

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

...

直接呼び出し [1] は期待どおりに値を返しますが、適用呼び出し [2] は常に行 [0] で次のエラーを生成します。

TypeError: Cannot set property 'NaN' of undefined

[2] で他のいくつかのスコープ パラメータを試しました: nullnimbusnimbus.Clientnimbus.Client.prototypenimbus.Client.prototype[req.params.command]およびclient[req.params.command]、すべて成功しませんでした。

呼び出される関数の実際のスコープを変更せずに apply メソッドを呼び出して、直接呼び出した場合とまったく同じように動作させるにはどうすればよいですか?

4

1 に答える 1

12

applyこのように関数を同じ関数に戻すと、元のスコープが保持されます。

client[req.params.command].apply(client, [console.log]);
于 2012-12-05T18:44:15.580 に答える