-1

私はオブジェクトを持っています

var actions = {
    'photos': function()
    {
        var self = this; // self = actions

        $.get('./data.php?get=photos', function(data)
        {
            self.result = data;
        });
    },
    'videos': function()
    {
        var self = this;

        $.get('./data.php?get=videos', function(data)
        {
            self.result = data;
        });
    }
};

actions各関数は、呼び出されたときにもう1つのアイテムを作成しますresult

次に、これを使用する代わりにswitch(うまく機能します):

if (actions[action])
{
    actions[action](); // call a function
    console.log(actions);
    console.log(actions.result);
}

actionphotos値または。を持つ変数ですvideos

console.log(actions)これを与える:

Object
message: function ()
messages: function ()
profile: function ()
profile-edit: function ()
result: "<div>...</div>"
__proto__: Object

ですから、値のあるresultアイテムがあると思います。actions"<div>...</div>"

ただし、はをconsole.log(actions.result) 返します undefined

なんで?

このコードはすべて書き直される可能性があることは知っていますが、その理由を理解したいと思いundefinedます。

4

1 に答える 1

3

非同期リクエストを処理しているため、「コールバック」を使用します。

非同期リクエストの準備ができると、コールバックが呼び出されます。リクエストは応答を受け取り、その応答をコールバックとともに送信します。コールバックが応答を処理します。

var actions = {
    'photos': function(callback)
    {
        $.get('./data.php?get=photos', callback);
    },
    'videos': function(callback)
    {
        $.get('./data.php?get=videos', callback);
    }
};

var action = 'photos';

actions[action](function(data) {
    console.log(data);
});

あなたは値を維持することに固執するので、私はこの構造を使用します:

var actions = {
    'photos': function()
    {
        $.get('./data.php?get=photos', function() {
            this.__callback('photos', data);
        });
    },

    'videos': function()
    {
        $.get('./data.php?get=videos', function() {
            this.__callback('videos', data);
        });
    },

    '__callback': function(action, data) {
        this.results[action].push(data);
    },

    'results': {
        'photos': [],
        'videos': []
    }
};

var action = 'photos';

actions[action]();

// use a timeout because we are dealing with async requests
setTimeout(function() {
    console.log(actions.results); // shows all results
    console.log(actions.results.photos); // shows all photos results
    console.log(actions.results.videos); // shows all videos results
}, 3000);

なんて恐ろしいコードなのか...

于 2013-01-10T14:02:25.500 に答える