2016-10-20 2 views
0

ausführen Ich habe diese Funktion, die auf einen Knopfklick aufgerufen wird und später führte dies 2 verschiedene Funktionen aus, jetzt muss ich es nacheinander als einige der Eingabe für ausführen Die zweite Funktion kommt von der vorherigen.wie man Funktionen nebeneinander mit Typescript und Promises

processPayment(){ 
     console.log("payment called", this.registrationList); 
     this.registerLoading.present().then(() => { 
     //function1 
     this.sendRegistration().then(data => { 
      this.registerLoading.dismiss(); 
      this.paymentLoading.present().then(() => { 
      //function 2 
       this.sendPayments().then (data => { 
        this.paymentLoading.dismiss(); 
        this.nav.popToRoot(); 
        this.doAlert("Event Registration & Payments successful"); 
       }); 
      }); 
     }); 
     }); 
    } 

Funktion 1:

sendRegistration(){ 
    return new Promise(resolve => { 
     for(let registration of this.registrationList){ 
      //codes removed for simplification 
      this.eventsService.postRegistration(eventRegistration) 
      .then(data => { 
       console.log("called", data); 
       this.invoices.push(data.Invoice.Id); 
      }); 
     } 
    }); 
    } 

Funktion 2:

sendPayments(){ 
    return new Promise(resolve => { 
       //codes removed for simpplication 
     }); 
    } 

Obwohl ich sehen kann, dass es scheint nacheinander auszuführen, aber erste Funktion ist überhaupt nicht enden, so kann ich nicht sehen, die zweite Ausführung.

+0

sagen Sie „erste Funktion überhaupt endet nicht“. Bedeutet es, dass 'console.log (" called ", data) nie passiert? Könnte es tatsächlich auf den Funktionscode bezogen sein, die '// Codes zur Vereinfachung entfernt? – enkryptor

Antwort

0

sollten Sie die volle Leistung von Chaining genannt Versprechen verwenden:

processPayment(){ 
    console.log("payment called", this.registrationList); 
    this.registerLoading.present().then(() => { 
    //function1 
    return this.sendRegistration() 
    }).then(data => { 
    this.registerLoading.dismiss(); 
    return this.paymentLoading.present() 
    }).then(() => { 
    //function 2 
    return this.sendPayments() 
    }).then(data => { 
    this.paymentLoading.dismiss(); 
    this.nav.popToRoot(); 
    this.doAlert("Event Registration & Payments successful"); 
    }); 
} 

Aber Ihr eigentliches Problem ist man nie Versprechen in sendRegistration lösen, und in Ihrem Fall es ist kompliziert, weil Sie, bis alle this.postRegistration Versprechen warten müssen sind fertig. Dies könnte mit der Methode Promise.all() geschehen, die wartet, bis alle Versprechen erfüllt sind. Ich hoffe, Sie werden verstehen, wie es von Ihrem Beispiel funktioniert:

sendRegistration(){ 
    let allPostRegistrationPromises = []; 
    for (let registration of this.registrationList) { 
     //codes removed for simplification 
     let promise = this.eventsService.postRegistration(eventRegistration) 
     .then(data => { 
      console.log("called", data); 
      this.invoices.push(data.Invoice.Id); 
      return data; 
     }); 
     allPostRegistrationPromises.push(promise); 
    } 
    return Promise.all(allPostRegistrationPromises); 
} 

Dieser Code sollte funktionieren, aber ich habe es nicht getestet.

Sie sollten wirklich diesen großen Artikel lesen, zu verstehen, wie Promises arbeiten und ihre wirkliche Macht: https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html