2016-11-03 3 views
-1

Ich muss 3 Anfragen in der Kette machen. Also benutze ich dafür jquery.Zurückgestellte Ketten in jquery

Request 1 
-> on done if response contains expected result then Request 2 else return empty array/null 
-> on done if response contains expected result then Request 3 else return empty array/null 

private request1() { 
    const vm = this; 

    vm.isLoading(true); 
    let deffer = system.defer(dfd => {dataService.getResponse1() 
     .done((response) => { 
       request2(response.collection)) 
       dfd.resolve(); 
     }); 

    return deffer.promise(); 
} 

private request2(collection) { 
    dataService.getResponse2(collection) 
     .done((response) => request3(response.collection)); 
} 

private request3(collection) { 
    dataService.getResponse3(collection) 
     .done((response) => saveResponse(response.collection)); 
} 

private saveResponse(collection) { 
    //do some stuff  
} 

in Constructor nenne ich request1 wie

vm.request1().done(() => { 
     vm.isLoading(false); 
}); 

Das Problem ist, dass isLoading-false vor setted wird saveResponse genannt wird. Wie sollte ich meine Anfrage-Struktur korrekt umbauen, um isLoading zu aktualisieren, nachdem alle Anfragen beendet sind?

Danke.

+0

Ich denke, Sie möchten dfd.resolve() im done-Handler in request3 aufrufen. Eine Möglichkeit besteht darin, dfd an request2 und dann an request3 zu übergeben. Wo Sie den Anruf jetzt haben, wird das Versprechen zu Beginn von Anfrage2 gelöst. – mab

+0

Mögliches Duplikat von [Wie verkette ich eine Sequenz von zurückgestellten Funktionen in jQuery 1.8.x?] (Http://stackoverflow.com/questions/13651243/how-do-i-chain-a-sequence-of-secreated-) functions-in-jquery-1-8-x) –

Antwort

0

auf diese Weise versuchen (bitte Kommentare im Code):

// Request 1 -> on done Request 2 -> on done -> Request 3 

private request1() { 
    const vm = this; 

    vm.isLoading(true); 
    let deffer = system.defer(dfd => {dataService.getResponse1() 
     .done((response) => { 
       // 1. Here you have to resolve the dfd promise after 
       // request2 promise is resolved. For this reason, 
       // I added the call to "done()" method. 
       request2(response.collection)).done((response2) => { dfd.resolve()}); 
     }); 

    return deffer.promise(); 
} 

private request2(collection) { 
    // 2. You need to return the promise returned by getResponse2 
    return dataService.getResponse2(collection) 
     .done((response) => request3(response.collection)); 
} 

private request3(collection) { 
    // 3. You need to return the promise returned by getResponse3 
    return dataService.getResponse3(collection) 
     .done((response) => saveResponse(response.collection)); 
} 

private saveResponse(collection) { 
    //do some stuff  
} 

in request3() Sie das Versprechen von getResponse3() zurück So kehren, was wiederum das Versprechen von saveResponse() innerhalb des done() Methode aufgerufen zurück zurückkehren .

In request2() geben Sie das Versprechen zurück, das von getResponse() zurückgegeben wird, das seinerseits das Versprechen zurückgibt, das von request3() zurückgegeben wird, das in dem vorherigen Absatz beschrieben wird.

In request1(), im Haupt done() Rückruf, rufen Sie request2() und warten (mit done()) es beendet ist, bevor das Haupt Versprechen lösen.

Auf diese Weise sollte vm.isLoading(false) aufgerufen werden, wenn request2 und request3 abgeschlossen wurden.

+0

Eine Beschreibung, was Sie geändert haben und wie es hilft, wäre eine gute Idee. –

+0

Nur hinzufügen;) – Andrea

+0

Ihre Lösung funktioniert für mich. Aber was kannst du über @mab comment sagen - ist es gut, deferent als param zu übergeben? Danke – demo

0

Kurze Antwort: Verschieben Sie vm.isLoading(true); in den Körper von request3, nachdem Sie saveResponse aufrufen.

+0

Es scheint wie 'vm.isLoading (false);' ist gesetzt, bevor ich 'saveResponse' aufrufen – demo