2017-12-21 2 views
1

Ich habe ein Problem mit dem complete() Code in meiner Ajax Kette - es wird nicht ausgeführt, wenn erwartet.Ajax complete() in then() Kette wird nicht ausgeführt, wenn erwartet

Meine Ajax-Funktion zeigt einen Spinner unter beforeSend() an und blendet ihn unter complete() aus, um den laufenden Indikator anzuzeigen. Ich dachte, dies wären die Endpunkte, die ich erfassen könnte, um zu entscheiden, wann ich den Spinner zeigen soll.

function ajaxGetActivityId() { 

var promise = $.ajax({ 
    type : "post", 
    dataType : "json", 
    url : '/myapp/activityId', 
    data : '', 
    beforeSend: function(){ 
     showLoading(); 
    }, 
    complete: function(){ 
     hideLoading(); 
    }   
}); 

    return promise; // Return a promise from this function 

} 

Diese Funktion wird in der .then() Kette wie folgt aufgerufen, durch eine äußere Funktion:

function outer() { 

var promise = ajaxGetActivityId() 
      .then(function(data) { 
       outerFunction2(); 
      }); 

Der Debugger zeigt, dass

  1. I beforeSend erste und zeigen auf die Ajax-Methode des bekommen die Spinner, das ist richtig
  2. Dann komme ich zu outerFunction2() vor meine Ajax-Anfrage ist abgeschlossen! An diesem Punkt ist der Spinner immer noch gezeigt, und es sollte nicht sein. Ich dachte, ich wäre garantiert nicht bis outerFunction2() bis der Ajax-Aufruf abgeschlossen.
  3. Dann irgendwann auf der Straße, erreiche ich die complete()

Antwort

1

Aus der Dokumentation der Ajax-Funktion ...

komplette
Eine Funktion, wenn die Anforderung aufgerufen werden endet (nach Erfolg und Fehler Callbacks ausgeführt werden).

Ich stelle mir vor, dass schließt auch nach andere Versprechen Handler wie then/done ausgeführt wird.

Ich würde nur die Versprechen Resolutionen nacheinander verketten. Entfernen Sie zum Beispiel complete und versuchen

function ajaxGetActivityId() { 
    return $.ajax({ ... }) 
    .then(data => { 
     hideLoading() 
     return data 
    }) 
} 

Dies garantiert, dass der hideLoading() Anruf getätigt wird, bevor andere Versprechen Auflösung Handler auszuführen.

+0

Ja das war es. Erstaunlich - aber auch schlecht für die Code-Qualität, der Code wird zu Spaghetti und jetzt kann ich den Spinner nicht kompakter in den Ajax-Funktionen einkapseln. Es ist schrecklich, dass es vor() Downstream-Operationen keinen Platzhalter für die Vervollständigung gibt, sehr inkontuitiv. –

Verwandte Themen