-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每个函数在被调用中再创建一项result

然后,而不是switch我使用这个(效果很好):

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

action是具有值photos或的变量videos

console.log(actions)给出了这个:

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

所以我认为有resultitem inactions的 value "<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);

gaaah 多么可怕的一段代码……

于 2013-01-10T14:02:25.500 回答