Возврат данных из обратного вызова JSONP - PullRequest
1 голос
/ 11 ноября 2011

У меня есть класс, который выбирает данные 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 ]

2 голосов
/ 11 ноября 2011

Конечно, это проблема времени.С 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 голос
/ 11 ноября 2011

Как отмечалось в существующих комментариях, поскольку метод 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]);
            }
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...