функция возвращает после XMLHttpRequest - PullRequest
0 голосов
/ 14 мая 2010

Хорошо, я знаю, что подобные вопросы, вероятно, задавались десятки раз, но я не могу найти работающее решение для своего проекта. В последнее время, используя jQuery для множества вызовов AJAX, я оказался в форме ада обратного вызова. Вопрос о том, является ли jQuery слишком мощным для этого проекта, выходит за рамки этого вопроса. В общем, вот код, который показывает, что происходит:

function check_form(table)
{
  var file = "/models/"+table+".json";
  var errs = {};

  var xhr = $.getJSON(file, function(json)
  {
    for (key in json)
    {
      var k = key;
      var r = json[k];
      $.extend(errs, check_item("#"+k,r));
    }
  });
  return errs;
}

И ... как вы, наверное, догадались, я получил пустой объект. Моя первоначальная идея заключалась в том, чтобы использовать какую-то идею onReadyStateChange, которая возвращалась бы всякий раз, когда readyState наконец-то достигнет 4. Однако это заставляет мое приложение зависать бесконечно. Мне нужны эти ошибки, чтобы решить, разрешено ли отправлять форму или нет (а также сообщить пользователю, где находятся ошибки в приложении. Есть идеи?

Редактировать. Это не самое красивое решение, но мне удалось заставить его работать. По сути, check_form передает json из другой функции вместо загрузки. Я тоже уже загружал его туда, так что, вероятно, лучше не продолжать загружать один и тот же файл снова и снова. Я просто беспокоился о перегрузке памяти. Эти файлы не совсем большие, поэтому, наверное, все в порядке.

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Встроенная функция в вашем вызове $ .getJSON будет запущена после завершения вызова Ajax. Работайте внутри этой функции (обратного вызова).

0 голосов
/ 14 мая 2010

Ваша check_form функция должна принять обратный вызов для выполнения, когда информация станет доступной позже.

function check_form(table, callback)
{
  var file = "/models/"+table+".json";
  var xhr = $.getJSON(file, function(json)
  {
    var errs = {};
    for (key in json)
    {
      var k = key;
      var r = json[k];
      $.extend(errs, check_item("#"+k,r));
    }
    callback(errs);
  });
}

Затем, пусть вызывающие check_form обеспечивают обратный вызов:

var table = getSomeTable();
check_form(table, function(errs)
{
    for (var key in errs)
    {
        var value = errs[k];
        // do something with key/value pair
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...