Angular $ q返回承诺多个$ http调用 [英] Angular $q returning promise multiple $http calls
问题描述
我正在处理一个$ http调用,该调用循环遍历多个api的每一个并返回一个对象中的所有数据.通常,在发出$ http调用后,我通常会准备好解决诺言.与此类似:
I'm working on an $http call that loops over each of multiple api's and returns all of the data in one object. I usually have the promise ready to resolve when the $http call has been made. Similar to this:
function getAllData(api) {
return $http({
method: 'GET',
url: '/api/' + api
})
.then(sendResponseData)
.catch (sendGetVolunteerError);
}
我拥有的当前函数遍历每个api,并将api中的每个对象推入数组,然后将其推入整个数组.我有这个功能,返回一个多维数组,需要将其展平.
The current function I have loops over each api and pushes each object in the api into an array and then pushes it into an overall array. I had this functioning, returning an multi-dimensional array, which needed to be flattened out.
我想在承诺中退还这笔款项,但我正在退还undefined
.到目前为止,这是我所拥有的?有没有更好的方法来解决这个问题?
I'd like to return this in a promise, but am returning undefined
. Here is what I have so far? Is there a better way to approach this?
dataService:
dataService:
function getSearchData() {
return {
loadDataFromUrls: function () {
var apiList = ["abo", "ser", "vol", "con", "giv", "blo", "par"];
var deferred = $q.defer();
var log = [];
angular.forEach(apiList, function (item, key) {
var logNew = [];
$http({
method: 'GET',
url: '/api/' + item
}).then(function (response) {
angular.forEach(response.data, function (item, key) {
this.push(item);
}, logNew);
return logNew;
});
this.push(logNew);
}, log);
$q.all(log).then(
function (results) {
deferred.resolve(
JSON.stringify(results))
},
function (errors) {
deferred.reject(errors);
},
function (updates) {
deferred.update(updates);
});
return deferred.promise;
}
};
};
控制器:
function getSearchData(){
return dataService.getSearchData.loadDataFromUrls;
}
$scope.searchData = getSearchData();
推荐答案
$q.all
和map
函数是您在这里需要的:
$q.all
and a map
function are what you need here:
function getSearchData() {
return {
// returns a promise for an object like:
// { abo: resultFromAbo, ser: resultFromSer, ... }
loadDataFromUrls: function () {
var apiList = ["abo", "ser", "vol", "con", "giv", "blo", "par"];
return $q.all(apiList.map(function (item) {
return $http({
method: 'GET',
url: '/api/' + item
});
}))
.then(function (results) {
var resultObj = {};
results.forEach(function (val, i) {
resultObj[apiList[i]] = val.data;
});
return resultObj;
});
}
};
}
这篇关于Angular $ q返回承诺多个$ http调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!