2010-03-18 9 views
1

У кого-нибудь были такие же впечатления от jQuery AJAX и beforeSend? Любой совет, как решить эту проблему?запрос jquery ajax отправляется до отправки

Что я делаю - это чтение из базы данных с вызовом AJAX, прежде чем я хочу отправить новые данные в базу данных через AJAX (мне нужно перейти на последнюю страницу всех комментариев). Случается, что beforeSend извлекает данные с данными, которые должны быть отправлены впоследствии. Есть идеи?

$.ajax({ 
    type: 'POST', 
    url: '_php/ajax.php', 
    dataType:"json", 
    async:false, 
    data:{ 
    action : "addComment", 
    comment_author : comment_author_val, 
    comment_content : comment_content_val, 
    comment_parent_id : comment_parent_id_val, 
    comment_post_id : "<?=$_REQUEST["ID"]?>" 
    }, 

beforeSend: function() { 
    //WHAT A MESS... 
    if (typeof commentOpen == "undefined") { 
    $.get("_php/ajax.php", { action: "getComments", commentPage: '', ID: "<?=$_REQUEST["ID"]?>" }, 
     function(data){ 
     $('#comments > ul').html(data); 
     return true; 
     } 
    ); 
    } 
}, 
+0

На самом деле я мог бы написать это немного другое ... Как СБРОСА-AJAX -> Обратный вызов -> WRITE AJAX - > ПРИЛОЖИТЬ HTML TO DOM ... Но я действительно хотел бы использовать beforeSend – Bosh

ответ

3

Ваши данные действия поиска в beforeSend является асинхронным, то есть $.get() возвращается немедленно, а затем beforeSend возвращается немедленно. Затем $.ajax() продолжает выполнение. На данный момент звонок $.ajax() уже идет полным ходом и имеет головной головной звонок по вызову $.get(). Я не уверен точно, как два запроса обрабатываются одновременно под обложками, но это и есть суть этого.

Что вы хотите сделать, это сделать $.get() выполнить синхронно, не асинхронно. Таким образом, beforeSend не вернется, пока поиск данных не завершится. Для этого просто добавьте async: false в объект объекта $.get().

+0

Упс, означающий «async: false». –

+0

$ .get() не поддерживает свойство async ... я заменил его на ajax() и использовал его там ... Кажется, что работает ;-) Не успевайте проверить его более подробно, но он выглядит многообещающий ;-) Черт возьми! – Bosh

1

Ваша попытка сделать слишком много с beforeSend. Лучше вам сначала выполнить свой первый вызов aComment getComments и запустить его при вызове addComment. Что-то вроде этого:

if (typeof commentOpen == "undefined") { 
    getComments({ commentPage: '', ID: "<?=$_REQUEST["ID"]?>" }); 
} 
function getComments(data){ 
    data = $.extend({action : "getComments"}, data); 
    $.ajax({ 
     type: 'GET', 
     url: '_php/ajax.php', 
     data: data, 
     success: function(data){ 
      $('#comments > ul').html(data); 
      addComment({ 
       comment_author: comment_author_val, 
       comment_content: comment_content_val, 
       comment_parent_id: comment_parent_id_val, 
       comment_post_id: "<?=$_REQUEST["ID"]?>" 
      }); 
     } 
    }); 
} 
function addComment(data) { 
    data = $.extend({action : "addComment"}, data); 
    $.ajax({ 
     type: 'POST', 
     url: '_php/ajax.php', 
     dataType: "json", 
     data: data 
    }); 
} 
0

Наконец нагрузки() решить проблему ;-)

+2

Что вы подразумеваете под нагрузкой(), решили вашу проблему. Вы можете остановиться на этом? Благодарю. –

Смежные вопросы