如何使用第一个api的结果,在angularjs中进入第二个api调用?

时间:2016-01-04 20:49:26

标签: javascript angularjs api

我想使用第一个api的结果,进入第二个api调用。场景是这样的,我想使用第一个api的结果,进入第二个api调用。如果我是正确的,那么我想要同步api调用(不确定)。我试着编写以下功能但不起作用。 function2是在function1之前调用的。 在function2中我们使用的是仅在function2在function2之前调用时才会出现的result1,我该怎么做。

$scope.function1 = function(){
        var deferred= $q.defer();    
        $http.post(api1, data1)
        .success(function(response, status) {
          if (response.error == 0) {
            console.log(response.result);          
               $scope.result1=response.result;      
          }           
        }) ;    
        deferred.resolve('Success') ; 
        return deferred.promise;       
    };
    var promise =  $scope.addDefaultValue();
    promise.then(function(){
      $scope.function2();
    });

     $scope.function2=function(){
        var deferred = $q.defer();

        $http.post(api2,result1)
        .success(function(response, status){
          if(response.error == 0){

          }
        });
      deferred.resolve('Success') ;
      return deferred.promise;
    }

2 个答案:

答案 0 :(得分:1)

您无法将$http请求转换为“同步”。这不是“延期”的意思。延迟是一种将非承诺功能转换为具有承诺能力的功能的方法。 $http函数返回promise对象,因此您不需要使用deferred。

$http.post(api, data1).then(function (response) {
  $scope.result1 = response.data.result;
  // return is important here
  // so that you can keep chaining with .then
  return $http.post(api2, response.data.result);
}).then(function (response) {
  // here you have response from api2
  $scope.result2 = response.data.result;
  console.log(response.data);
}).catch(function (error) {
  // here you can handle errors
  // from either api calls
  // second api call won't be made if the first one fails
  console.log(error);
});

答案 1 :(得分:1)

您可以在此处遵循承诺链模式,在承诺对象上使用.then进行链接。

无需使用$q创建额外的开销承诺,因为$http方法在启动ajax时返回promise对象。

<强>代码

$scope.function1 = function() {
  return $http.post(api1, data1)
    .then(function(d) {
    var response = d.data;
    if (response.error == 0) {
      console.log(response.result);
      $scope.result1 = response.result;
    }
    return response;
  });
};

$scope.function1().then(function(data) {
  $scope.function2();
}, function(error) {

});