我有一个获取jsonp数据的类。我想简单地返回一个值,但我无法这样做。回调不会更新类属性 - 不确定它是时间或范围问题
Ext.define("App.ContentManager", {
extend: "Ext.util.Observable",
singleton: true,
data: 'empty',
getData: function() {
this.doLoad();
console.log(a.data) //not correct - shows original value
return this.data;
},
doLoad: function(url) {
var a = this;
Ext.util.JSONP.request({
url: "http://example.com/somejson",
callbackKey: "callback",
callback: function(c) {
a.data = c;
console.log(a.data) //correct json data is here
}
})
},
});
答案 0 :(得分:2)
当然是时间问题。使用doLoad()
函数中的getDate
,您只需启动请求即可完成,以便在下一行中准备好数据。您只能在callback: function
方法的doLoad
中准备好数据。因此,无论您需要做什么,最好在一个函数中发送请求,然后在callback:function
中有一个将使用返回数据的函数。
<强>更新强>
我也注意到也是一个范围问题。您通过添加
来传递JSONP请求中的范围 url: "http://example.com/somejson",
scope: this, //this line
callbackKey: "callback",
然后在getDate中你应该:this.data
,因为a
是doLoad
方法中的局部变量。
答案 1 :(得分:1)
如现有注释中所述,由于doLoad
方法异步检索数据,因此无法直接从方法调用返回结果。你的两个选择是:
或者你甚至可以做两件事(未经测试):
doLoad: function(options) {
var me = this;
Ext.util.JSONP.request({
url: options.url,
scope: me,
callbackKey: "callback",
callback: function(data) {
me.fireEvent('dataloaded', me, data);
if (options.callback) {
options.callback.apply(options.scope || me, [data]);
}
}
})
}