2016-06-23 4 views
1

同時に呼び出すことのできるサービスコールのリストを持っていますが、他の1つのコールは呼び出されなければなりません。 。私はこれを設定して、他のコールは.then(function() {})コールのブロックまで発生しませんでした。 Chrome Dev Toolsをチェックして(そしてSqlエラーに基づいて確認を得る)、then節のすべての呼び出しが前に実行されています。私はここで間違って何をしていますか?元の機能の前に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.partnerAddRepository.addExisting(this.operation.operationId, this.partner.customerId) 
      .then(() => { 
       this.executeSaves(promises); 
      }); 


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

そして、ここではpartnerAddRepo.addExisting機能です:

partnerAddRepository.addExistingコールが解雇される前ので、4つの異なるサービスコールが含まれている executeSaves中のものは、呼び出されている
addExisting = (operationId: number, partnerId: number) => { 
     return this.$http.put(`my/path/to/operation/${operationId}/partner/${partnerId}`); 
    }; 

、なぜ?

+1

ええと、下向きの説明に注意してください。 – ganders

+0

タイミングが取れますか?あなたはそれらの約束を配列に押し込んでいるだけでなく、約束を返すものは何でも発射します。 – lintmouse

答えて

2

サービスコールは、コールするとすぐに実行されます。プロミスは、関数の実行ではなく、関数呼び出しの戻り値を延期します。

partnerAddRepository.addExistingが値を返した後にのみ他の関数を呼び出す場合は、thenコールバックに約束事の配列を作成する必要があります。

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

完璧な、ありがとう。 .then()内のそのチャンク全体を入れ子にする必要があるとは思わないでしょう。 – ganders

+0

私はそのチャンクを関数に入れ、その関数だけを呼び出すことになります。このようにして 'then'はあまり乱雑です – yarons