2009-06-20 25 views
20

Quiero entender la siguiente llamada AJAX, en términos del método complete();Use success() o complete() en la llamada AJAX

Si se sustituyen con complete()success(), consigo un vacío responseText al igual que con el método AJAX error().

Por otro lado, cuando dejo el método complete() allí tal como está, todo funciona como se esperaba.

¿Es que success() devuelve antes que 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; 
}); 

Respuesta

12

"complete" se ejecuta cuando finaliza la llamada ajax. "éxito" se ejecuta cuando la llamada ajax finaliza con un código de respuesta exitoso.

+0

gracias, pero para ser claros, tengo que usar el código para ejecutar bajo una opción completa y no bajo éxito. ¿Y la opción de error también funcionará solo con la opción completa? –

+0

o, sugiere que no obtengo un código de respuesta de éxito, ¿extraño? –

35

complete se ejecuta después de que se haya ejecutado la devolución de llamada success o error.

Tal vez deba consultar el segundo parámetro complete también. Es una cadena que contiene el tipo de éxito que tuvo ajaxCall.

Los diferentes devoluciones de llamada se describen un poco más en detalle aquí jQuery.ajax(options)


supongo que se ha perdido el hecho de que el complete y la función success (sé API inconsistente) obtener diferentes datos que se pasan en. success obtiene solo los datos, complete obtienen el objeto completo XMLHttpRequest. Por supuesto, no hay ninguna propiedad responseText en la cadena de datos.

Así que si reemplaza complete con success también tiene que reemplazar data.responseText con data solamente.

éxito

La función se pasa dos argumentos : Los datos devueltos por el servidor el formato indicado en el parámetro 'tipoDatos', y una cadena que describe el estado.

completa

La función se pasa dos argumentos: el objeto XMLHttpRequest y una cadena que describe el tipo de éxito de la petición.

Si necesita tener acceso a todo el objeto XMLHttpRequest en la devolución de llamada correcta, le sugiero que lo intente.

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

Vaya, el comentario vino al mismo tiempo Entonces, si lo entiendo bien. La función completa contiene toda la información que necesito. El éxito contiene menos a menos que pase dos argumentos en la función. Espero no estar siendo estúpido, ¿pero está completo como lo usé entonces no lo suficiente todo el tiempo? ¿O es que el éxito es más ligero? –

+0

Además de mi último comentario, mi código de arriba aún califica el error. En resumen, ¿hará todo sin inconvenientes si dejo fuera la opción de éxito? Lo siento si suena como si aún no lo entendiera. Es un poco confuso para mí. –

+0

Edité mi pregunta para contener el código completo que utilicé No da ningún error, pero probablemente pueda cortar la opción de éxito. Si el resultado es el mismo –

18

es lo que success() regresa antes de lo complete()?

; el método AJAX success() se ejecuta antes del método complete().

A continuación se muestra un diagrama que ilustra el flujo del proceso:

AJAX call process flow diagram.

Es importante señalar que

  • El success() (Evento Local), sólo se llama si la solicitud se ha realizado correctamente (no hay errores del servidor, no hay errores con los datos).

  • Por otro lado, se llama al complete() (Evento local) independientemente de si la solicitud fue exitosa o no. Siempre recibirá una devolución de llamada completa, incluso para solicitudes síncronas.

... más detalles sobre AJAX Eventos here.

Cuestiones relacionadas