2017-06-30 11 views
1

2つのhttp呼び出しをチェーンしようとしています。最初のレコードは一連のレコードを返し、次にそれぞれのレコードを取得する必要があります。2つのhttpコールをAngularJSでチェーンする方法は?

flightRecordService.query().$promise.then(function (flightRecords) { 
    $scope.flightRecords = flightRecords; 
    for (var i = 0; i < $scope.flightRecords.length; i++) { 
    $scope.flightRecords[i].financeDocument = 
     financeDocumentService 
     .isReferencedDocumentIdCompensated({ 
     id: $scope.flightRecords[i].id 
     }).$promise.then(
     function (data) { 
      return ({ 
      'isCompensated': data.headers['compensated'] 
      }); 

     } 
    ); 
    console.log($scope.flightRecords); 
    } 
}); 

これはFlightRecordオブジェクトです:

$$hashKey: "object:27" 
aircraft: {id: 100, registration: "LV-OEE", model: "152", status: "ACTIVE", brand: "Cessna", …} 
amountOfHours: 1 
canceled: false 
closed: false 
crew: [Object] (1) 
destiny: null 
endFlight: "2017-01-06T20:54:05.296" 
financeDocument: d 
    --> $$state: {status: 1, value: {isCompensated: "false"}} 
    --> d prototipo 
id: 100 
landings: 0 
nature: "LDI" 
opened: true 
origin: null 
purpose: "VP" 
startFlight: "2017-01-06T19:44:05.296" 
status: "OPENED" 
type: "ENT" 

financeDocumentオブジェクトは、私が期待する構造を有していない...私は次の形式を必要とする:私は変更する必要がどのような

... 
endFlight: "2017-01-06T20:54:05.296" 
financeDocument: { isCompensated: "false" } 
id: 100 
... 

それを得るために?

ありがとうございます!

答えて

1

元のオブジェクトに設定してみませんか?

flightRecordService.query().$promise.then(function (flightRecords) { 
    $scope.flightRecords = flightRecords; 
    for (var i = 0; i < $scope.flightRecords.length; i++) { 
     (function(record) { 
      financeDocumentService 
      .isReferencedDocumentIdCompensated({ 
      id: $scope.flightRecords[record].id 
      }).$promise.then(
      function (data) { 
       $scope.flightRecords[record].financeDocument = { 
       'isCompensated': data.headers['compensated'] 
       } 
      }); 
    })(i) 
    console.log($scope.flightRecords); 
    } 
}); 
+1

ありがとう@FrankerZ !!!できます!! – Esteban

+0

こんにちは@FrankerZ、まずあなたのお手伝いをしてくれてありがとうと思います。私が助けてくれるかどうか聞いてみたいのですが、私はあなたがしたときに何をしているのか理解したいと思っています。(function(record){... ..})(i) 'ありがとう、もう一度! – Esteban

+1

キャプチャを作成し、機能の持続時間中のI(記録されている)の値を保持します。それがなければ、データ関数は最後の値を今度は最後の値に重ねて何度も上書きします。 – FrankerZ

-1

Promiseを使用してfinanceDocumentプロパティを同期して設定しようとしています。約束の成功コールバックで変数を設定する必要があります。

+0

こんにちは@amahfouz、どうすればいいですか?おかげで – Esteban

2

は何をしたいと思うことは、あなたが余分な詳細情報を取得してきた場合に、各「フライトレコード」エントリを変更です。また、操作が完了したことを発信者に知らせるには、おそらく$q.allを使用します。

const promise = flightRecordService.query().$promise.then(flightRecords => { 
    return $q.all(flightRecords.map(flightRecord => { 
    return financeDocumentService.isReferencedDocumentIdCompensated({ 
     id: flightRecord.id 
    }).$promise.then(data => Object.assign(flightRecord, { 
     isCompensated: data.headers.compensated 
    })) 
    })) 
}) 

promise.then(flightRecords => { 
    $scope.flightRecords = flightRecords 
}) 
+0

'flightRecord.isCompensated = data.headers.compensated'の代わりに' Object.assign'を使用する理由が不思議ですか? – FrankerZ

+0

@FrankerZ 'Object.assign'は修正されたオブジェクトを返します。したがって、そのオブジェクトの約束を解決します。代わりに 'data => {flightRecord.isCompensated = data.headers.compensated; return flightRecord} ' – Phil

+2

私はそれがより多くの連鎖のために使用できる約束を返すのが好きです – georgeawg

関連する問題