2011-11-10 90 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]); 
      } 
     } 
    }) 
}