使用Angularjs中另一个$ http中的一个$ http响应

时间:2017-07-25 13:51:14

标签: angularjs json http promise angular-promise

首先,我想使用$ http来接收一些数据(例如学生),然后我想进行另一个$ http调用来获取,例如studentDetails。之后我想将一些学生详细信息附加到学生JSON上。 此外,我需要第一次通话的响应,以便为第二次通话创建网址。

问题是我无法访问另一个内部第一个http调用的响应。 有谁知道如何做到这一点?

var getStudents = function(){
   var deferred = $q.defer();
   $http.get("https://some_url")
   .success(function(response){
      deferred.resolve(response);
   }).error(function(errMsg){
      deferred.reject(errMsg);
   });
   return deferred.promise;
}
var appendStudentDetails = function(){
  getStudents().then(function(response){
     var studentsWithDetails = response;
     for(var i=0; i<studentsWithDetails.length; i++){
        $http.get("some_url/"+studentWithDetails[i].user.details+"/")
           .success(function(res){

             //here I want to append the details, 
             //received from the second http call, to each student 
             //of the array received from the first http call 

             //PROBLEM: I cannot access response of the
             //first http call inside the another
           })
     }
  })

1 个答案:

答案 0 :(得分:3)

您正在使用延迟反模式以及已弃用的成功/错误回调。您应该使用then,因为它返回一个承诺,您可以链接承诺。

以下是您如何做到这一点的示例:

function getStudents(){
    return $http.get('[someurl]');
}
function appendStudentDetails(studentsWithDetails){
    for(var i=0; i<studentsWithDetails.length; i++){
        appendSingleStudentDetails(studentsWithDetails[i]);
    }
}
function appendSingleStudentDetails(singleStudent){
    $http.get("some_url/"+singleStudent.user.details+"/")
        .then(function(res){
            // Append some stuff
            singleStudent.stuff = res.data;
        });
}

// Call it like this:
getStudents()
    .then(function(response){ return response.data; })
    .then(appendStudentDetails);

我决定根据其名称稍微改变appendStudentDetails函数的结构,但您可以像以前一样轻松地在方法中调用getStudents()

小心不要在内部i - 函数中使用then - 变量,因为这会导致关闭时遇到麻烦。

修改:修复示例以避免i处于关闭状态时出现问题。