2012-08-06 11 views
10

Ho un ajax chiamata comejQuery: Funziona Ajax entrambi i gestori - fatto e non riescono

$.ajax({ 
     type: 'POST', 
     url: 'addVideo', 
     data: { 
      video_title: title, 
      playlist_name: playlist, 
      url: id 
      // csrfmiddlewaretoken: '{{ csrf_token }}', 
     }, 
     done: bootstrap_alert.success('video saved successfully'), 
     fail: bootstrap_alert.error('There were some errors while saving the video. Please try in a while') 
    }); 

e le azioni come

// setting up alerts on action 
bootstrap_alert = function() {} 
bootstrap_alert.success = function(message) { 
    $('#feature').prepend('<div class="alert alert-success"><a class="close" data-dismiss="alert">×</a><span>'+message+'</span></div>'); 
} 
bootstrap_alert.error = function(message) { 
    $('#feature').prepend('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a><span>'+message+'</span></div>'); 
} 

Quando la parte anteriore fa la chiamata ajax, vedo entrambe le notifiche a allo stesso tempo

video saved successfully 
There were some errors while saving the video. Please try in a while 

È che non sto effettuando correttamente la chiamata ajax?

UPDATE
cambiando done a success risultati in stesso comportamento

// send the data to the server using .ajax() or .post() 
     $.ajax({ 
      type: 'POST', 
      url: 'addVideo', 
      data: { 
       video_title: title, 
       playlist_name: playlist, 
       url: id 
       // csrfmiddlewaretoken: '{{ csrf_token }}', 
      }, 
      success: bootstrap_alert.success('video saved successfully'), 
      fail: bootstrap_alert.error('There were some errors while saving the video. Please try in a while') 
     }); 

La risposta del server è HTTP/1.0" 200 3200, credo che la fail non dovrebbe ottenere chiamato

+0

Sei sicuro che '$ ('# funzione')' non è modificato da un'altra parte del tuo codice? –

+0

Sì, non viene modificato – fullstackcrash

risposta

15

I valori dovrebbero essere funzioni, richiamate. Ma quello che stai facendo è chiamarli subito. Avvolgi i callback in funzioni anonime.

$.ajax({ 
    type: 'POST', 
    url: 'addVideo', 
    data: { video_title: title, playlist_name: playlist, url: id } 
}).done(function(){ 
    bootstrap_alert.success('video saved successfully'); 
}).fail(function(){ 
    bootstrap_alert.error('There were some errors while saving the video. Please try in a while'); 
}); 
+0

questo è grande, ho appena realizzato questa soluzione, grazie – fullstackcrash

7

done viene sempre chiamato. Questo dovrebbe succedere. Dovresti gestire il tuo codice di successo nella proprietà success.

+2

In altre parole, 'done' è usato quando devi fare qualcosa se la richiesta è fallita o no, come rimuovere un indicatore di caricamento dallo schermo –

+0

ma fallire non dovrebbe essere chiamato su' HTTP /1.0 "200 3200' risposta, non è vero? – fullstackcrash

+0

cambiando il' done' a 'successo' risulta ancora nello stesso comportamento – fullstackcrash

0

Provare a sostituire done con success e fail con error? Li stai usando come opzioni mentre sono hook di callback.

+0

Ho provato che @Jill, lo stesso comportamento di prima – fullstackcrash

1

cambiando in questo modo ha funzionato

// send the data to the server using .ajax() or .post() 
     $.ajax({ 
      type: 'POST', 
      url: 'addVideo', 
      data: { 
       video_title: title, 
       playlist_name: playlist, 
       url: id 
       // csrfmiddlewaretoken: '{{ csrf_token }}', 
      }, 
      success: function(response, textStatus, jqXHR){ 
       // log a message to the console 
       console.log("Hooray, it worked!"); 
       bootstrap_alert.success('video saved successfully'); 
      }, 

      // callback handler that will be called on error 
      error: function(jqXHR, textStatus, errorThrown){ 
       // log the error to the console 
       console.log("The following error occured: "+ textStatus, errorThrown); 
       bootstrap_alert.error('There were some errors while saving the video. Please try in a while'); 
      }, 
     }); 
2

Hai bisogno di avvolgerla in una funzione anonima (come altri hanno notato). Ma non ho visto nessuno menzionare il motivo (che penso valga la pena di menzionare).

Il motivo per cui è necessario eseguire questa operazione è dovuto al fatto che javascript assegna la valutazione del lato destro del colon sul lato sinistro. Per valutare il lato destro, è necessario prima eseguire la funzione. Tuttavia se hai una funzione anonima sul lato destro, definisce la funzione stessa come valore del riferimento sul lato sinistro (in javascript il valore di una variabile può essere una funzione) e assegna la funzione come è a sinistra lato (che ora è un riferimento alla funzione). Quindi, ritarda la valutazione (eseguendo la funzione) fino al completamento della chiamata ajax.

Problemi correlati