1

Node.js を使用して Web アプリケーションのサーバー側を作成しようとしています。次のコードは、状況をシミュレートするために抽出されています。問題は、actionExecuted の「メソッド」で this.actions.length にアクセスしようとすると、アプリケーションがクラッシュすることです。プロパティ this.actions は、「コンストラクター」(Request 関数自体) で定義されていても、そこでは定義されていません (スコープ内の this == {})。他の「メソッド」からもアクション プロパティにアクセスできるようにするにはどうすればよいですか?

var occ = {
    exampleAction: function(args, cl, cb)
    {
        // ...

        cb('exampleAction', ['some', 'results']);
    },

    respond: function()
    {
        console.log('Successfully handled actions.');
    }
};

Request = function(cl, acts)
{
    this.client = cl;
    this.actions = [];
    this.responses = [];

    // distribute actions
    for (var i in acts)
    {
        if (acts[i][1].error == undefined)
        {
            this.actions.push(acts[i]);
            occ[acts[i][0]](acts[i][1], this.client, this.actionExecuted);
        }
        else
            // such an action already containing error is already handled,
            // so let's pass it directly to the responses
            this.responses.push(acts[i]);
    }
}

Request.prototype.checkExecutionStatus = function()
{
    // if all actions are handled, send data to the client
    if (this.actions == [])
        occ.respond(client, data, stat, this);
};

Request.prototype.actionExecuted = function(action, results)
{
    // remove action from this.actions
    for (var i = 0; i < this.actions.length; ++i)
        if (this.actions[i][0] == action)
            this.actions.splice(i, 1);

    // and move it to responses
    this.responses.push([action, results]);
    this.checkExecutionStatus();
};

occ.Request = Request;

new occ.Request({}, [['exampleAction', []]]);
4

1 に答える 1

2

問題は、コールバックを定義する方法です。後で呼び出されるため、コンテキストが失われます。クロージャを作成するか、適切にバインドする必要がありthisます。クロージャを作成するには:

var self = this;
occ[acts[i][0]](acts[i][1], this.client, function() { self.actionExecuted(); });

にバインドするにはthis:

occ[acts[i][0]](acts[i][1], this.client, this.actionExecuted.bind(this));

どちらかが機能するはずです。

于 2012-04-08T18:34:39.427 に答える