链接多个$http.get()ng init angularjs

链接多个$http.get()ng init angularjs,angularjs,angular-promise,angularjs-http,Angularjs,Angular Promise,Angularjs Http,我正在处理一个场景,在页面加载时,我有2个$http.get()请求。一个$http.get()独立于另一个$http.get()。一切正常。但在某些情况下,我的第二个$http.get()请求在第一个$http.get()请求之前执行,因此我无法获得所需的输出。我们如何链接请求?因为我是安格拉斯的新手,所以我没有那么多想法 $scope.onload=function() { var responsePromise1=$http.get(第一次rest调用); responsePromise1

我正在处理一个场景,在页面加载时,我有2个
$http.get()
请求。一个
$http.get()
独立于另一个
$http.get()
。一切正常。但在某些情况下,我的第二个
$http.get()
请求在第一个
$http.get()
请求之前执行,因此我无法获得所需的输出。我们如何链接请求?因为我是安格拉斯的新手,所以我没有那么多想法

$scope.onload=function()
{
var responsePromise1=$http.get(第一次rest调用);
responsePromise1.success(函数(数据){
console.log(数据、平台、记录);
$scope.records=data.platform.record;
});
错误(函数(数据、状态、标题、配置){
警报(“ajax失败”);
});
var responsePromise2=$http.get(第二个rest调用);
responsePromise2.成功(功能(数据2){
console.log(data2.platform.record);
$scope.records2=data2.platform.record;
});
错误(函数(数据2、状态、标题、配置){
警报(“ajax失败”);
});
}
$scope.buto=函数(datafrom1st,datafrom2nd)
{
var responsePromise3=$http.get(第三个rest调用);
responsePromise3.success(函数(data3){
console.log(data3.platform.record);
$scope.records3=data3.platform.record;
});
错误(函数(数据3、状态、标题、配置){
警报(“ajax失败”);
});
}

{{record.id}
{{record2.name}
{{record3.data}

在第一个请求的成功方法中调用第二个请求:

var responsePromise1 = $http.get(1st rest call);
        responsePromise1.success(function(data)
        { 
          console.log(data.platform.record);
          $scope.records=data.platform.record;
var responsePromise2 = $http.get(2nd rest call);
        responsePromise2.success(function(data2)
        {
        console.log(data2.platform.record);
        $scope.records2=data2.platform.record;
        });
        responsePromise2.error(function(data2, status, headers, config)
        {
          alert("ajax 2 failed");
        });
        });
        responsePromise1.error(function(data, status, headers, config)
        {alert("ajax failed");
        });

$HTTPAPI基于$q服务公开的延迟/承诺API

$http
  .get(1st rest call)
  .then(function(data){
       $scope.records = data.platform.record;
       return $http.get(2nd rest call);
  })
  .then(function(result){
     //result of 2nd rest call
  })
  .catch(function(err){
     // Here catch error
  })

如果它们彼此独立,您可以尝试使用Promise.all。但是您需要按照特定的顺序执行代码

var responsePromise1 = $http.get(1st rest call);
var responsePromise2 = $http.get(2nd rest call);
var promises = [responsePromise1,responsePromise2]

// Array of Promises
$q.all(promises)
    .then(function(data){
         var data1 = data[0];
         var data2 = data[1];
         // Put logic here to handle both responses.
         return $http.get(3rd rest call);
     })
     .then(function(data3){
         // Put logic here to handle third response
     });
试着这样做

   $scope.onload = function()
    {
    var responsePromise1 = $http.get(1st rest call);
        responsePromise1.success(function(data) { 
    SecondInit()
        console.log(data.platform.record);
            $scope.records=data.platform.record;
        });

        responsePromise1.error(function(data, status, headers, config) {
            alert("ajax failed");
        });


      }
    function SecondInit(){
    var responsePromise2 = $http.get(2nd rest call);
        responsePromise2.success(function(data2) {
            console.log(data2.platform.record);
            $scope.records2=data2.platform.record;
        });

        responsePromise2.error(function(data2, status, headers, config) {
            alert("ajax failed");
        });

在这里,我尝试将第二个api调用绑定到名为SecondInit()的函数,并在第一个api调用成功时在其中调用。这可能会有所帮助。

您可以使用
$q来实现这一点。根据Hoyen的建议,all

$scope.onload = function(){

    var promise1 = $http.get('/request1');
    var promise2 = $http.get('/request2');

    $q.all([ promise1, promise2 ]).then(function(data){
        var response1 = data[0].platform.record;
        var response2 = data[1].platform.record;

        $scope.records = response1.map(function(e, i){
            var id = e.id;
            var name = response2[i].name;
            return {id: id, name: name};
        });
    });
};
然后在您看来,请执行以下操作:

<body>
    <div ng-init="onload()">
        <div ng-repeat="record in records">
            <div>{{record.id}}</div>
            <div>{{record.name}}</div>
            <button type="button" class="btn btn-primary btn-sm ng-cloak" style="padding-bottom:25px;font-weight:bold;" 
                ng-click="butto(record.id,record.name)"></button>
        </div>
    </div>
</body>

{{record.id}
{{record.name}

这应该行得通,但我真的建议你找到一个好的最新角度教程,并阅读最佳实践。这并不是解决这类问题的最佳方法

兄弟,但我使用2个ng-init。一个用于第一个请求,另一个用于第二个请求。你是什么意思?我有两个不同的函数。我认为你应该在成功方法中添加第二个init,在这种情况下,这个异步方法,所以当第一次成功时,您需要调用第二次。在成功方法中添加ng init函数是否有问题。它是否被执行?您的
responsePromise1
responsePromise2
之前执行,但它们都是异步调用,这意味着我们无法保证谁将首先完成。如果您需要链接请求,则您的
responsePromise2
必须位于
responsePromise1
success
内。如果它们是独立的,则不应链接它们。如果它们彼此独立,则使用“全部承诺”。在“then”回调中,它将有两个响应。使用控制器而不是
ng init
,并使用服务调用API。发布您的html和路由以获得更好的答案请参见。另请参见。您能否解释有关$q.all(承诺)
$q.all([])
返回一个承诺,当传递给它的所有承诺都已解决时,该承诺将得到解决。因此,在这种情况下,当
responsePromise1
responsePromise2
都已成功解析时,调用
then
中的函数。如果任何一个通过的承诺失败/被拒绝,则
$q.all
也会立即被拒绝。如果
responsePromise1
responsePromise2
是真正独立的,我不确定这是您想要的,因为如果一个失败,另一个也会失败。bro我有3$http.get()。我希望前两个的输出在第三个请求中通过,那么你应该把它包括在你的原始问题中。有点不清楚你想要实现什么。我怎样才能实现呢,兄弟。我被困在这个地方