2013-01-10 79 views
-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是值为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的原因。

+3

你的问题是相当不清楚。 'action'是对'actions.photos' /'actions.videos'(正如@dystroy认为的那样)或字符串'“photos”'/'“videos”'的引用吗? 'items [action]();'中的'items'是什么?如果'action'是对'actions.photos'的引用,那么为什么要使用函数引用来索引另一个对象呢? –

+1

'items [action]()'是一个错字,应该是'actions [action]()'而不是。固定。 –

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

既然你ensist在保持价值观,我会用这样的结构:

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什么可怕的一段代码...

+0

我想保留'$ .get'的当前结构,因为在每个'actions'项目中可以在'self.result = data'后面使用额外的代码 –

+2

@JohnRezza然后在您的匿名成功回调的结束:'$ .get(“...”,function(data){self.result = data; callback();})' – apsillers