2010-05-14 2 views
0

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

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. Это заставляет мое приложение зависать бесконечно. Мне нужны эти ошибки, чтобы решить, форма, разрешена ли или не подавать или нет (а также, чтобы сообщить пользователю, где ошибки в приложении. Есть идеи?

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

ответ

1

Встроенная функция в вашем вызове $ .getJSON будет запускается, когда вызов Ajax завершен. Сделайте свою работу внутри (cal lback).

+0

Это будет работать, за исключением того, я абсолютно _должны_ в конце концов вернуть истинный или ложный обратно к проводнику представить. check_form вызывается другой функцией, которая возвращает 'return (countProps (errs) == 0)? true: false; 'ему нужно будет предоставить данные из этой функции, если только я просто ничего не пропущу. – ashays

+0

Вы не можете этого сделать, потому что JavaScript управляется событиями по своей природе. Нет функций ожидания/ожидания, поэтому вы не можете приостановить текущий код. Вы должны попытаться переосмыслить логику. –

+0

Хммм, я посмотрю, что я могу придумать, чтобы исправить это. Думаю, мне нужно вернуться к чертежной доске с другой идеей. Казалось, что эта работа так хорошо работает. :П – ashays

0

Функция 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 
    } 
}); 
Смежные вопросы