获取对象值

时间:2013-01-10 13:57:55

标签: javascript jquery html

我有一个对象

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是一个值为photosvideos的变量。

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

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

所以我认为resultactions项的值为"<div>...</div>"

console.log(actions.result) 返回 undefined

为什么吗

我知道所有这些代码都可以重写,但我想了解undefined的原因。

1 个答案:

答案 0 :(得分: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多么可怕的代码...