Javascript 如何在AngularJS中链接两个http调用?

Javascript 如何在AngularJS中链接两个http调用?,javascript,angularjs,json,Javascript,Angularjs,Json,我正在尝试链接两个http调用。第一个返回一组记录,然后我需要获取每个记录的财务数据 flightRecordService.query().$promise.then(function (flightRecords) { $scope.flightRecords = flightRecords; for (var i = 0; i < $scope.flightRecords.length; i++) { $scope.flightRecords[i].financeDo

我正在尝试链接两个http调用。第一个返回一组记录,然后我需要获取每个记录的财务数据

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);
  }
});
financeDocument对象没有我期望的结构。。。我需要以下格式的文件:

...
endFlight: "2017-01-06T20:54:05.296"
financeDocument: { isCompensated: "false" }
id: 100
...
我需要改变什么才能得到它


非常感谢

您正在尝试使用承诺同步设置financeDocument属性。您需要在promise的成功回调中设置变量。

为什么不在原始对象上设置它呢

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);
  }
});
flightRecordService.query().$promise.then(函数(flightRecords)){
$scope.flightRecords=flightRecords;
对于(变量i=0;i<$scope.flightRecords.length;i++){
(功能(记录){
财务文件服务
.IsReferenceDocumentIDCompensed({
id:$scope.flightRecords[record].id
})那么,我保证(
功能(数据){
$scope.flightRecords[record].financeDocument={
'isCompensated':data.headers['compensated']
}
});
})(一)
log($scope.flightRecords);
}
});

当您检索到额外的详细信息时,您要做的是修改每个“飞行记录”条目。您可能还需要使用
$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
})

嗨@amahfouz,我该怎么做?感谢您为什么使用
对象。assign
而不仅仅是执行
flightRecord.isCompensated=data.headers.compensated
?@FrankerZ
对象。assign
返回修改后的对象,从而解决该对象的承诺。另一种选择是
data=>{flightRecord.isCompensated=data.headers.compensated;return flightRecord}
我喜欢它返回一个承诺,可以用于更多的链接hanks@Phil!我使用@FrankerZHi@FrankerZ提供的解决方案,首先我想感谢您的帮助,然后我想问您是否可以帮助我,我只是想了解您当时在做什么:
(函数(记录){…})(我)
再次非常感谢!它创建一个捕获,并在函数期间保留I的值(即记录)。如果没有它,data函数将一次又一次地覆盖最后一个键,因为i现在是最后一个值。
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
})