2016-11-17 53 views
1

我一直使用简单的http方法返回的诺言很长一段时间。但我需要首先链接多个API调用并处理数据并返回该数据。问题我目前正在执行的是工厂没有回复承诺,因此不等待数据并执行控制器的下一行。合并多个API调用和处理后从工厂方法返回承诺

app.factory('mytestService', ['$http', function($http){ 
    getSomeDataById: function(id){ 
    var userAllProjects = []; 
    var myHelperService = this.getSecondData; 
    this.getFirstData(id).then(function(response){ // first api call 
     var idObjectValue = response['result'][0]['id']; 
     myHelperService(idObjectValue).then(function(response){ //second api call 
      userAllProjects= response['projectList'] 
     }); 
    }); 
    return userAllProjects 
    } 
]); 

现在控制器,当我做:

$scope.allProjects = mytestService.getSomeDataById(1234); 
console.log($scope.allProjects); 

控制台打印不确定的。我知道这是因为它不会等待服务完成并删除下一行。

我是小角度承诺的新手,所以不知道如何处理。任何人都可以在这里帮我。 如果您需要更多信息,请让我知道。

+0

功能'getSomeDataById'全部过程后,没有返回 – Weedoze

+0

它返回userAllProjects。 – undefined

+0

它不等待请求完成 – Weedoze

回答

-1

请尝试下面的代码。

getSomeDataById: function(id){ 
    var userAllProjects = $q.defer(); 
    var myHelperService = this.getSecondData; 
    this.getFirstData(id).then(function(response){ // first api call 
    var idObjectValue = response['result'][0]['id']; 
    myHelperService(idObjectValue).then(function(response){ //second api call 
     userAllProjects.resolve(response['projectList']) 
    }); 
    }); 
    return userAllProjects.promise; 
} 

这个想法是,你先创建一个延迟对象,然后返回承诺。当数据可用时,您解析延迟对象,数据将在您的控制器中可用。

注意:您将需要添加的依赖$q

编号:https://docs.angularjs.org/api/ng/service/$q

+0

我认为那就是我一直在寻找的东西。你拯救了我的日子@Vivek。谢谢 – undefined

0

您可以使用then你的控制器内,而不是

app.factory('mytestService', ['$http', function($http) { 
    getSomeDataById: function(id) { 
     var myHelperService = this.getSecondData; 
     return this.getFirstData(id); 
    }, 
    secondApiCall : function(idObjectValue){ 
     return myHelperService(idObjectValue); 
    } 
}]); 

控制器

mytestService.getSomeDataById(1234).then(function(response){ 
    mytestService.secondApiCall(response['result'][0]['id']).then(function(response2){ 
    $scope.allProjects = response.data; 
    }) 
}); 
3

介绍Promise Chaining,它通常优于创造新deferred

getSomeDataById: function(id){ 
    var userAllProjects = []; 
    var myHelperService = this.getSecondData; 

    // returning promise rather than creating a new one, 
    // to prevent unresolved promise if one of the calls in the chain gets rejected 
    return this.getFirstData(id).then(function(response){ // first api call 
     var idObjectValue = response['result'][0]['id']; 
     return myHelperService(idObjectValue); //second api call 
     // instead of writing .then here, 
     // it can be moved to the outer layer for easy reading 

    }).then(function(response){ 
     userAllProjects = response['projectList']; 
     // return something you need to use in .then of getSomeDataById() here 
    }); 
});