2011-11-10 88 views
1

返回的数据我有取JSONP数据的类。我想简单地返回一个值,但不能这样做。回调不更新类属性 - 不知道它是否是时间或范围问题从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

回调是异步的,所以你打电话后doLoad – Joe

回答

2

当然是计时问题。随着在getDate功能doLoad()你刚开始的请求,你不等待它以准备好下一行的数据完成。您只需要在doLoad方法的callback: function中准备好数据。所以无论你需要做什么,最好在一个函数中发送请求,然后在callback:function中有一个函数,它将使用返回的数据。

而且我只注意到更新是一个范围的问题了。你喊传入JSONP请求的范围与添加

  url: "http://example.com/somejson", 
     scope: this, //this line 
    callbackKey: "callback", 

然后在GETDATE你应该:this.data因为a是在doLoad方法局部变量。

+0

感谢a.data没有立即返回 - 病患者标记这个答案是正确的,因为它是第一个 - 我最终在我的sencha视图中加载我的json并将其应用于html – cyberwombat

1

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

  • 有回调参数定义你的方法(这是在内线本身通常进行的),这样的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]); 
      } 
     } 
    }) 
}