2012-08-06 10 views
10

Ich habe einen ajax Aufruf wiejQuery: Ajax beide Handler läuft - fertig und scheitern

$.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') 
    }); 

und Aktionen wie

// 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>'); 
} 

Wenn das vordere Ende Ajax-Aufruf macht, ich sehe beide Mitteilungen an die gleiche Zeit

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

Ist das nicht ich mache den Ajax-Aufruf richtig?

UPDATE
done-success Ergebnisse in demselben Verhalten zu ändern

// 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') 
     }); 

Die Serverantwort ist HTTP/1.0" 200 3200, glaube ich, die fail nicht

+0

Sind Sie sicher, '$ ('# feature')' wird nicht von einem anderen Teil Ihres Codes geändert? –

+0

Ja, es ist nicht geändert – fullstackcrash

Antwort

15

Die Werte werden als Funktionen erwartet, Rückrufe. Aber, was Sie tun, ruft sie sofort an. Wickeln Sie Ihre Rückrufe in anonymen Funktionen um.

$.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

das ist großartig, ich habe gerade diese Lösung realisiert, Danke – fullstackcrash

7

done aufgerufen sollte immer aufgerufen. Das soll passieren. Sie sollten Ihren Erfolgscode in der Eigenschaft success behandeln.

+2

Mit anderen Worten, 'done' wird verwendet, wenn Sie etwas tun müssen, ob die Anfrage fehlgeschlagen ist oder nicht, wie Entfernen einer Ladeanzeige aus dem Bildschirm –

+0

, aber Fail sollte nicht auf' HTTP aufgerufen werden /1.0 "200 3200' response, nicht wahr? – fullstackcrash

+0

das' done' zu ​​'success' zu ändern, führt immer noch zu demselben Verhalten – fullstackcrash

0

Versuchen Sie, done durch success und fail durch error zu ersetzen? Sie verwenden sie als Optionen, während sie Callback-Hooks sind.

+0

Ich habe das versucht @Jill, das gleiche Verhalten wie zuvor – fullstackcrash

1

wie dieser Wechsel arbeitete

// 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

Sie müssen es in einer anonymen Funktion wickeln (wie andere hier schon berichtet haben). Aber ich habe niemanden gesehen, der warum erwähnt hat (was meiner Meinung nach erwähnenswert ist).

Der Grund, warum Sie dies tun müssen, ist, weil Javascript die Auswertung der rechten Seite des Doppelpunkts der linken Seite zuweist. Um die richtige Seite zu bewerten, muss zuerst die Funktion ausgeführt werden. Wenn Sie jedoch eine anonyme Funktion auf der rechten Seite haben, definiert sie die Funktion selbst als den Wert der Referenz auf der linken Seite (in JavaScript kann der Wert einer Variablen eine Funktion sein) und weist die Funktion so zu, wie sie ist Seite (die jetzt ein Verweis auf die Funktion ist). Es verzögert also die Auswertung (Ausführen der Funktion), bis Ihr Ajax-Aufruf abgeschlossen ist.

Verwandte Themen