2016-06-23 4 views
1

Ich habe eine Liste von Service-Anrufe, die ich alle zur gleichen Zeit anrufen kann, aber ich habe 1 anderen Anruf, der aufgerufen werden muss, und abgeschlossen, bevor die anderen abgefeuert werden . Ich habe dies eingerichtet, so dass die anderen Anrufe nicht vor dem .then(function() {}) Block des Anrufs aufgetreten sind. Wenn Sie die Chrome-Entwicklungstools überprüfen (und eine Bestätigung basierend auf dem Sql-Fehler erhalten), werden alle Aufrufe in der then-Klausel bereits ausgelöst. Was mache ich hier falsch?Winkelfeuerung Funktion in dann Klausel vor der ursprünglichen Funktion

 var promises = []; 

     if (this.partner.customerId > 0) { 
      if (this.isDirty('ipn.individualPartnerName')) { 
       promises.push(this.partnerEditService.updateIndividualName(<Interfaces.IIndividualPartner>this.partner)); 
      } 

      if (this.isDirty('bpa.mailingAddressForm') || this.isDirty('bpa.streetAddressForm')) { 
       promises.push(this.partnerEditService.updateAddresses(this.partner)); 
      } 

      if (this.isDirty('bn.businessName')) { 
       promises.push(this.partnerEditService.updateBusinessName(<Interfaces.IBusinessPartner>this.partner)); 
      } 

      if (this.isDirty('rc.individualPartnerResponsibilities') || this.isDirty('rc.businessPartnerResponsibilities')) { 
       promises.push(this.partnerEditService.updateResponsibilities(this.operation, this.partner)); 
      } 
     } 

     this.partnerAddRepository.addExisting(this.operation.operationId, this.partner.customerId) 
      .then(() => { 
       this.executeSaves(promises); 
      }); 


    executeSaves = (promises) => { 
     this.$q.all(promises) 
      .finally(() => { 
       this.$mdDialog.hide(this.partner); 
      }); 
    } 

Und hier ist die partnerAddRepo.addExisting Funktion:

addExisting = (operationId: number, partnerId: number) => { 
     return this.$http.put(`my/path/to/operation/${operationId}/partner/${partnerId}`); 
    }; 

das Zeug in der executeSaves, also, der die 4 verschiedenen Service-Anrufe enthält aufgerufen wird, bevor der Anruf partnerAddRepository.addExisting gefeuert wird, warum?

+1

Uh, kümmern Sie sich um den Downvote zu erklären. – ganders

+0

Könnte es Timing sein? Sie drängen diese Versprechen in die Reihe, aber auch feuern, was auch immer die Versprechen zurückbringt. – lintmouse

Antwort

2

Ihre Serviceanrufe werden ausgeführt, sobald Sie sie anrufen. Promises verzögert den Rückgabewert des Funktionsaufrufs und nicht die Ausführung der Funktion.

Wenn Sie die andere Funktion nur aufrufen möchten, nachdem partnerAddRepository.addExisting einen Wert zurückgegeben hat, sollten Sie das Array der Versprechen im Rückruf then erstellen.

this.partnerAddRepository.addExisting(this.operation.operationId, this.partner.customerId) 
    .then(() => { 
     var promises = []; 

     if (this.partner.customerId > 0) { 
      if (this.isDirty('ipn.individualPartnerName')) { 
       promises.push(this.partnerEditService.updateIndividualName(<Interfaces.IIndividualPartner>this.partner)); 
      } 

      if (this.isDirty('bpa.mailingAddressForm') || this.isDirty('bpa.streetAddressForm')) { 
       promises.push(this.partnerEditService.updateAddresses(this.partner)); 
      } 

      if (this.isDirty('bn.businessName')) { 
       promises.push(this.partnerEditService.updateBusinessName(<Interfaces.IBusinessPartner>this.partner)); 
      } 

      if (this.isDirty('rc.individualPartnerResponsibilities') || this.isDirty('rc.businessPartnerResponsibilities')) { 
       promises.push(this.partnerEditService.updateResponsibilities(this.operation, this.partner)); 
      } 
     } 

     this.executeSaves(promises); 
}); 
+0

perfekt Herr, danke. Hätte nie gedacht, dass ich den gesamten Chunk in der .then() – ganders

+0

verschachteln müsste. Ich würde diesen Chunk wahrscheinlich in eine Funktion einfügen und nur diese Funktion aufrufen. Auf diese Weise ist das 'Dann' weniger chaotisch – yarons

Verwandte Themen