1

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
            }
        })
    },
});
4

2 に答える 2

2

もちろんタイミングの問題です。関数でdoLoad()getDate、リクエストを開始するだけで、次の行でデータを準備するためにリクエストが完了するのを待ちません。callback: functionメソッドのでデータを準備するだけdoLoadです。したがって、何をする必要があるとしても、1 つの関数で要求を送信し、callback:function返されたデータを使用する関数を使用するのが最善です。

アップデート

また、スコープの問題にも気付きました。を追加して、JSONP リクエストでスコープを渡します。

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

そして、 getDate で次のことを行う必要があります。メソッドのローカル変数であるthis.dataためです。adoLoad

于 2011-11-11T00:05:39.817 に答える
1

既存のコメントで指摘されているように、doLoadメソッドはデータを非同期的に取得するため、メソッド呼び出しから直接結果を返す方法はありません。あなたの2つのオプションは次のとおりです。

  • JSONP コールバック内で渡されたコールバック関数を実行し、返されたデータを渡すように、コールバック パラメータを使用してメソッドを定義します (これは一般的に Ext 自体で行われます)。
  • クラスが 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]);
            }
        }
    })
}
于 2011-11-11T17:02:42.600 に答える