现在,前五页结果中的每个Google链接都是:在我的浏览器中访问过,我需要问...
如何让JSON数据正常工作,以便我可以访问它/用其他方法操作它?
_otherMethod: function() {
// END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
var text = this._requestText();
},
_requestText: function() {
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
// works here
console.log(data);
// works here as well & fires local function
testing(data);
// doesnt store
var testvar_1 = data;
}
});
// undefined
console.log(testvar_1);
function testing(data) {
// logs when called from above
console.log(data);
// doesnt store
var testvar_2 = data;
}
// undefined
console.log(testvar_2);
// havent found this yet...
return magicVariableThatLetsMeAccessJSON
}, ...
任何想法?我知道关于堆栈溢出的许多其他类似问题,但我发现没有解决这个问题。
感谢
更新
var storage;
var yourobj = {
_otherMethod: function() {
// END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
var text = this._requestText();
},
_requestText: function() {
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
storage = data;
// logs correctly
console.log(storage);
}
});
}
}
//undefined
console.log(storage);
yourobj._requestText();
//undefined
console.log(storage);
答案 0 :(得分:2)
首先,如其他地方所述,您需要一个范围内的变量,其次,您需要确保在调用回调之前不对其进行评估。
确保这一点的唯一方法是在成功回调方法中调用_otherMethod
_otherMethod: function(text) {
//...do what ever you need to do with text
},
_requestText: function() {
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
_otherMethod(data);
},
}
});
}
回调是异步的,意味着它们在某个时间点被调用,而这些时间点不是由代码行序列决定的。 如果您知道在执行成功回调之前永远不会调用使用返回数据的代码,并且您需要保留数据,则可以将代码更改为
_otherMethod: null, //not strictly needed
_requestText: function() {
self = this;
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
self._otherMethod = function(data){
return function(){
//do what you need to with data. Data will be stored
//every execution of _otherMethod will use the same data
console.log(data);
}
}
},
}
});
}
答案 1 :(得分:1)
通过在变量名称前添加var
,可以在当前范围内创建局部变量。
这不起作用:
var a = 2;
(function() {
var a = 3;
})();
console.log(a); // 2
虽然这样做:
var a = 2;
(function() {
a = 3;
})();
console.log(a); // 3
由于您尝试设置的变量位于外部作用域中,因此在内部作用域中使用它时,请删除var
。
答案 2 :(得分:1)
很简单。您需要在回调函数的上下文之外的存储变量。
var storage;
var yourobj = {
_otherMethod: function() {
// END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
var text = this._requestText();
},
_requestText: function() {
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
storage = data;
}
});
}
}
或者,存储可以是同一对象的属性。
答案 3 :(得分:1)
可能就是这样:
_requestText: function() {
var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
var testvar_1;
$.ajax({
type: 'GET',
url: url,
async: false,
dataType: 'jsonp',
success: function(data) {
console.log(data);
testing(data);
testvar_1 = data;
}
});
// should work here
console.log(testvar_1);
实际上你在那里创建了var
的新实例。