Pregunta

Tengo un formulario en una página que añade nuevos datos a una base de datos a través de jQuery. Funciona bien, pero a veces el servidor dados a cabo y me da un 500 (Internal Server Error) , pero eso es porque mi servidor chupa.

El problema es que a veces me sale el error después de que el servidor de PHP hace que la adición de la base de datos, pero en lugar de recibir un mensaje de éxito, me sale el error, a pesar de que la adición se ha hecho. Entonces, ¿cómo debería ir sobre esto para asegurarse de que el PHP no añade los datos si se produce el error?

[Y sí, con el tiempo se cambia a un nuevo servidor, pero no hay ningún servidor es perfecto]

Aquí está la secuencia de comandos:

$.ajax({
  type: "POST",
  url: "/clase/do-add",
  data: $("#add").serialize(),
  dataType: "json",
  timeout: 8000,
  beforeSend: function() {
    var icon = '<p class="loading-add"></p>'; // loading icon
    $('form#add').append(icon);
  },
  success: function(data) {
    if (data.error == true) { // php returns error = true if name is invalid
      alert('Invalid name.');
      $('form#add').find('p').remove();
    } else {
      // make the addition
    }
  },
  error: function () { 
    $('form#add').find('p').remove();
    alert('Error. Try again.');
  }
});
¿Fue útil?

Solución

Se podría concluir que el Ajax llamada en una función y "reqest" de nuevo la función de error.

Algo Linke esto:

jQuery.fn = function yourajaxfunction(){
    $.ajax({
      type: "POST",
      url: "/clase/do-add",
      data: $("#add").serialize(),
      dataType: "json",
      timeout: 8000,
      beforeSend: function() {
        var icon = '<p class="loading-add"></p>'; // loading icon
        $('form#add').append(icon);
      },
      success: function(data) {
        if (data.error == true) { // php returns error = true if name is invalid
          alert('Invalid name.');
          $('form#add').find('p').remove();
        } else {
          // make the addition
        }
      },
      error: function () { 
        $('form#add').find('p').remove();
        // ####### i added this:
        $(this).yourajaxfunction();
        alert('Error. Try again.');
      }
    });
}

O usted podría tener una función ociosa que comprueba de nuevo después de algunos milisegundos antes de hacer funcionar la función de nuevo en el error:

$(this).idle().yourajaxfunction();

función Idle usado anteriormente:

jQuery.fn.idle = function(time){
    var o = $(this);
    o.queue(function(){
       setTimeout(function(){
          o.dequeue();
       }, time);
    });
    return o;
};

Pero lo mejor es fijar el servidor .. esto es sólo hacks y parches que compensan otro problema: el mal servidor. :)

Así que no es una idea buena para los escenarios de producción.

Otros consejos

Se puede crear un control de la inserción a la base de datos, si la adición de error devuelto.

   ...
   error: function () { 
        var fError = function() {

             $('form#add').find('p').remove();
             alert('Error. Try again.');

            };

       $.ajax({
          type: "GET",
          url: "/clase/do-check",
          data: {id: id}, // id for check
          dataType: "json",
          success: function(data) {
            if (!data.ok)
               fError();
          },
          error: function () { 
               fError();
          }
        });              
   }
   ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top