我有这样的代码:
var my = {};
(function () {
var self = this;
this.sampleData = { };
this.loadData = function() {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
self.sampleData = data;
}
);
};
}).apply(my);
my.loadData();
console.log(my.sampleData); // {}问题是my.sampleData什么都没有。
请在此处尝试此示例:http://jsfiddle.net/r57ML/
发布于 2012-04-18 18:16:52
原因是getJSON调用是异步,所以您要在返回数据之前查找数据。相反,直接或间接地将使用数据的代码放在回调中。
例如,您可以让您的loadData调用接受回调:
var my = {};
(function () {
var self = this;
this.sampleData = { };
this.loadData = function(callback) {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
self.sampleData = data;
callback(); // <==== Call the callback
}
);
};
}).apply(my);
my.loadData(function() { // <=== Pass in a callback
console.log(my.sampleData); // Now the data is htere
});旁注:由于您my对象是一个单例对象,您可以适当地简化代码,不需要apply、this或self,因为您的匿名函数是定义my的上下文上的闭包:
var my = {};
(function () {
my.sampleData = { };
my.loadData = function(callback) {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
my.sampleData = data;
callback();
}
);
};
})();
my.loadData(function() {
console.log(my.sampleData); // Now the data is htere
});当然,如果您使用的是构造函数或其他函数(您没有在引用的代码中使用,但是...),那么您当然可能需要更复杂的结构。
发布于 2012-04-18 18:17:09
(function () {
var self = this;
this.sampleData = {};
this.loadData = function() {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
self.sampleData = data;
console.log(my.sampleData); // you get sample data after ajax response
},
'json');
};
}).apply(my);
my.loadData();https://stackoverflow.com/questions/10207297
复制相似问题