从JSONP回调中返回数据

时间:2011-11-10 23:59:04

标签: extjs sencha-touch extjs4 sencha-touch-2

我有一个获取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
            }
        })
    },
});

2 个答案:

答案 0 :(得分:2)

当然是时间问题。使用doLoad()函数中的getDate,您只需启动请求即可完成,以便在下一行中准备好数据。您只能在callback: function方法的doLoad中准备好数据。因此,无论您需要做什么,最好在一个函数中发送请求,然后在callback:function中有一个将使用返回数据的函数。

<强>更新

我也注意到也是一个范围问题。您通过添加

来传递JSONP请求中的范围
          url: "http://example.com/somejson",
        scope: this,    //this line
  callbackKey: "callback",

然后在getDate中你应该:this.data,因为adoLoad方法中的局部变量。

答案 1 :(得分:1)

如现有注释中所述,由于doLoad方法异步检索数据,因此无法直接从方法调用返回结果。你的两个选择是:

  • 使用回调参数定义您的方法(这通常在Ext本身中完成),以便在JSONP回调中执行传递的回调函数,传递返回的数据。
  • 定义一个自定义事件,您的类可以从JSONP回调触发,将数据作为事件参数传递。在多个组件可能对JSONP调用的结果感兴趣的情况下,这将更合适。

或者你甚至可以做两件事(未经测试):

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