合并多个API调用和处理后从工厂方法返回承诺
问题描述:
我一直使用简单的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);
控制台打印不确定的。我知道这是因为它不会等待服务完成并删除下一行。
我是小角度承诺的新手,所以不知道如何处理。任何人都可以在这里帮我。 如果您需要更多信息,请让我知道。
答
请尝试下面的代码。
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
+0
我认为那就是我一直在寻找的东西。你拯救了我的日子@Vivek。谢谢 – undefined
答
您可以使用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;
})
});
答
介绍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
});
});
功能'getSomeDataById'全部过程后,没有返回 – Weedoze
它返回userAllProjects。 – undefined
它不等待请求完成 – Weedoze