Почему post () не обновляет DOM после его возвращения?Наблюдаются странные временные проблемы - PullRequest
1 голос
/ 20 мая 2010

У меня есть следующий код, который действительно меня беспокоит, я думаю, возможно, функция post () должна блокировать. Я новичок в jQuery (последняя версия) и AJAX, но я использую ColdFusion, который возвращает HTML в переменную данных.

var dataResult;
var statusResult;
$.post('fh_result.cfm',$('#myform').serialize(),function(data,status){
     dataResult = data;
     statusResult = status;
});
//alert(statusResult);
if ('success' == statusResult)
{
    alert(statusResult);
    $('#result').html(dataResult);
}

Когда я раскомментирую первое предупреждение, оно возвращает «неопределенное», но затем оно переходит в блок if, а в следующее окно с предупреждением «успех». Если я закомментирую эту строку, она вообще не попадет в оператор if. Я предполагаю, что я хочу сделать это блокирующим вызовом или чем-то еще, потому что я хочу вставить данные на страницу после публикации. У меня также есть проблема, когда я переписываю верхний код следующим образом:

var dataResult;
var statusResult;
$.post('fh_result.cfm',$('#myform').serialize(),function(data,status){
     dataResult = data;
     statusResult = status;

     alert(statusResult);
     $('#result').html(dataResult);
});
//alert(statusResult);

Теперь в этом случае предупреждение говорит «успех», когда я закомментирую второе окно предупреждения. Когда я раскомментирую это, я получаю одно предупреждение, которое говорит об успехе, и другое, которое говорит, что не определено, но на этот раз оно обновляет DOM с результатом обратной передачи по желанию. Как я могу сделать это без окна предупреждения?

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

Ваш .post() работает асинхронно. Пока он запускается, интерпретатор javascript продолжает работу и запускает оператор alert(), который находится вне тела post(). Поскольку post() является асинхронным, он почти наверняка не будет завершен к моменту вызова alert(), и поэтому ваши переменные statusResult и dataResult, вероятно, будут неопределенными. Только код, который выполняется внутри обратного вызова post() success, гарантированно будет выполняться последовательно.

Вы также можете попытаться использовать переменную, предоставленную непосредственно обратным вызовом success, вместо того, чтобы назначать ее другой переменной, первоначально определенной за пределами блока .post(). Итак:

 $('#result').html(data);

... вместо dataResult. Может быть красная сельдь, но стоит попробовать.

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

Он работает так, как должен. Вы не можете ожидать немедленного возврата вызова Ajax. Сообщение вызывается, и до возврата javascript продолжит выполнение остальных своих команд. Сообщение может вернуться через 1 миллисекунду, 1 секунду или 1 минуту. Но код в функции обратного вызова поста не будет выполняться, пока пост не отправится обратно с сервера.

...