как использовать значение после обратного вызова - PullRequest
1 голос
/ 26 февраля 2012

В моем приложении я изолирую сеть в методе и выполняю обратный вызов для получения ответа JSON, как я могу использовать его позже?

getJson(url, acallback);

function getJson(url, callback) {
    Ti.API.info(" im here " + url);
    var jsonObject;
    var xhr = Ti.Network.createHTTPClient();
    xhr.setTimeout(3000);
    xhr.onload = function () {
        var jsonObject = eval('(' + this.responseText + ')');
        callback.call(jsonObject)
    }
    xhr.open("GET", url);
    xhr.send();
    Ti.API.info(" passed ");
};

function acallback() {
    return this;
}

Теперь мои вопросы: как я могу использовать возвращенный результат позже?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012

Должно выглядеть так:

function getJson(url, callback) {
    Ti.API.info(" im here " + url );
    var jsonObject, xhr = Ti.Network.createHTTPClient();

    xhr.setTimeout(3000);
    xhr.onload = function() {
        var jsonObject = JSON.parse(this.responseText);
        callback(jsonObject)
    }
    xhr.open("GET" , url); 
    xhr.send(); 
    Ti.API.info(" passed " );
}

function acallback(json) {
      Ti.API.info("data from ajax: " + json);
}

getJson(url , acallback);

Обратите внимание, что я исключил использование eval , так как это плохая практика, как говорится ( здесь ):

Функция eval очень быстрая. Тем не менее, он может скомпилировать и выполнить любая программа на JavaScript, поэтому могут возникнуть проблемы с безопасностью. Использование eval указывается, когда источник является доверенным и компетентным. Это много безопаснее использовать парсер JSON. В веб-приложениях через XMLHttpRequest, общение разрешено только к тому же источнику, что страница, так что ей доверяют. Но это может быть не компетентно. Если сервер не является строгим в своей кодировке JSON, или если это не скрупулезно проверить все свои входные данные, тогда он может доставить недопустимый текст JSON это может быть опасный сценарий. Функция eval будет выполнить скрипт, раскрыв его злобу.

Кроме того, лучше использовать ключевое слово var только один раз для каждой области.


Редактировать

Если вы хотите использовать полученный объект json вне области обратного вызова, просто определите обратный вызов в области, где требуется json, например:

var obj = {
    x: 4,
    doit: function() {
        var _this = this;
        var callback = function(json) {
            alert(_this.x * json.y);
        };
        getJson(url , callback);
    }
}

Часть json.y , которую я только что составил для примера, конечно.


2-е редактирование

В качестве альтернативы, если вы хотите использовать опцию call , вы можете сделать это:

function getJson(url, callback, bindto) {
    Ti.API.info(" im here " + url );
    var jsonObject, xhr = Ti.Network.createHTTPClient();

    xhr.setTimeout(3000);
    xhr.onload = function() {
        var jsonObject = JSON.parse(this.responseText);
        callback.call(bindto, jsonObject)
    }
    xhr.open("GET" , url); 
    xhr.send(); 
    Ti.API.info(" passed " );
}

var obj = {
      x: 5
}

function myCallback(json) {
      alert(this.x * json.y);
}

getJson(url, myCallback, obj);

3-е редактирование

Если мы говорим на эту тему, я рекомендую использовать хороший трюк, который используется в Prototype , MooTools , jQuery и в соответствии с MDN был Введено в JavaScript 1.8.5 .

Function.prototype.bind = function(scope) {
  var _function = this;

  return function() {
    return _function.apply(scope, arguments);
  }
}

Вы можете прочитать учебник , в который я скопировал код.

1 голос
/ 26 февраля 2012

Я считаю, callback.call(jsonObject) на самом деле должен читать callback(jsonObject).После того, как вы вызвали асинхронную функцию, способ получить ее значение через обратный вызов.Таким образом, функция, которую вы передадите как callback, получит результат.Скажи,

function myCallback(value) {
    console.log(value);
}
1 голос
/ 26 февраля 2012

Код, который должен использовать вывод, должен быть помещен в acallback (или в функцию, которая вызывается из acallback) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...