2009-06-20 3 views
20

Я хочу понять вызов AJAX ниже, в терминах метода complete();Использовать success() или complete() в вызове AJAX

Когда я заменяю complete() с success(), я получаю пустой responseText так же, как с помощью метода AJAX error().

С другой стороны, когда я оставляю метод complete() там, как есть, все работает так, как ожидалось.

Действительно ли это, что success() возвращается раньше, чем complete()?

$("#formnaw").submit(function() { 
    var fnc = invoerFnc.attr("value"); 
    var vnaam = invoerVnaam.attr("value"); 
    var anaam = invoerAnaam.attr("value"); 
    var str1 = invoerStr1.attr("value"); 
    var nr1 = invoerNr1.attr("value"); 
    var pc1 = invoerPc1.attr("value"); 
    var pl1 = invoerPl1.attr("value"); 
    var tel1 = invoerTel1.attr("value"); 
    var mob1 = invoerMob1.attr("value"); 
    var em1 = invoerEm1.attr("value"); 
    var goknop = $("#formnaw > .instelling_go"); 
    //we deactiveren de submit knop tijdens het verzenden 
    goknop.attr({ 
    disabled: true 
    }); 
    goknop.blur(); 
    //stuur de post variabelen naar livetabs.php 
    $.ajax({ 
    type: "POST", 
    url: "registraties/instellingenact.php", 
    data: "actie=wijzignaw&vnaam=" + vnaam + "&anaam=" + anaam + "&functie=" + fnc + "&straat=" + str1 + "&nr=" + nr1 + "&postcode=" + pc1 + "&plaats=" + pl1 + "&tel=" + tel1 + "&mob=" + mob1 + "&email=" + em1, 
    timeout: 5000, 
    success: function(data, textStatus) { 
     alert('bij success'); 
     //doe iets 
     } //EINDE success 
     , 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     if (textStatus == 'timeout') { 
      //doe iets 
     } else if (textStatus == 'error') { 
      //doe iets 
     } 
     //her-activeer de zend knop 
     goknop.attr({ 
      disabled: false 
     }); 
     } //EINDE error 
     , 
    complete: function(data) { 
     updatelijst.append(data.responseText + "<br>"); 
     if (data.responseText.indexOf("Fout") != -1) { 
      $('#formnaw').find('td.foutnr1').prepend(data.responseText); 
     } else { 
      updatelijst.animate({ 
      opacity: 'show' 
      }, 1000, function() {}); 
     } 
     //her-activeer de zend knop 
     goknop.attr({ 
      disabled: false 
     }); 
     } //EINDE complete 
    }); //EINDE ajax 
    //we stoppen het standaard gedrag van een submit, zodat de pagina niet wordt vernieuwd. 
    return false; 
}); 

ответ

12

«complete» выполняется, когда вызов ajax завершен. «success» выполняется, когда вызов ajax заканчивается успешным кодом ответа.

+0

спасибо, но для того, чтобы быть ясным, мне нужно использовать код для выполнения по полной опции, а не под удачу. И будет ли вариант ошибки работать только с полным вариантом? – 2009-06-20 06:20:33

+0

или, это говорит о том, что я не получаю успешный отзыв, странный? – 2009-06-20 06:23:32

35

complete Выполняется после выполнения либо обратного вызова success, либо error.

Возможно, вы должны проверить второй параметр complete предложений тоже. Это String, обладающий типом успеха, который имел ajaxCall.

различных обратных вызовов описаны немного более подробно здесь jQuery.ajax(options)


Я думаю, вы пропустили тот факт, что complete и success функции (я знаю противоречивую API) получить различные данные, передаваемые в. success получает только данные, complete получает весь объект XMLHttpRequest. Конечно, в строке данных нет свойства responseText.

Поэтому, если вы замените complete на success, вам также необходимо заменить data.responseText на data.

успех

Функция получает передаются два аргумента : Данные, возвращаемые с сервера , отформатированные в соответствии с параметром «DATATYPE», и строка с описанием состояния.

полного

Функция получает передается два аргумента: XMLHttpRequest объект и строка, описывающая типа успеха запроса.

Если у вас есть доступ ко всему объекту XMLHttpRequest в обратном вызове успеха, я предлагаю попробовать это.

var myXHR = $.ajax({ 
    ... 
    success: function(data, status) { 
     ...do whatever with myXHR; e.g. myXHR.responseText... 
    }, 
    ... 
}); 
+0

oops, комментарий пришел в то же время Итак, если я получу это правильно. Полная функция содержит всю необходимую мне информацию. Успех содержит меньше, если вы не передадите два аргумента в функции. Надеюсь, я не становлюсь глупым, но полным, как я использовал, тогда не хватало все время? Или это успех более легкий? – 2009-06-20 06:58:13

+0

Также в дополнение к моему последнему комментарию, будет ли мой код сверху, все-таки ошибка. Короче говоря, будет ли он делать все без каких-либо недостатков, если я откажусь от варианта успеха. Извините, если это звучит так, как будто я пока этого не понимаю. Это немного смущает меня. – 2009-06-20 07:03:54

+0

Я отредактировал мой вопрос, чтобы содержать полный код, который я использовал Это не дает никаких ошибок, но я могу, возможно, сократить вариант успеха. Если результат тот же. – 2009-06-20 07:32:59

18

Является ли это, что success() возвращается раньше, чем complete()?

Да; метод AJAX success() выполняется до метода complete().

Ниже представлена ​​схема, иллюстрирующая последовательность операций процесса:

AJAX call process flow diagram.

Важно отметить, что

  • success() (локальное событие) вызывается только если запрос был успешным (никаких ошибок с сервера, никаких ошибок с данными).

  • С другой стороны, complete() (Местное событие) вызывается независимо от того, был ли запрос успешным, или нет. Вы всегда получите полный обратный вызов, даже для синхронных запросов.

... подробнее о AJAX События here.

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