我已经做了很多关于这方面的阅读,但最终我发现的教程和指南对我来说有太大的不同,可以很好地掌握这个概念。
这就是我想要实现的目标:
1)来自我们服务器的简单http请求[任何用于演示的API]
2)使用(1)中的数据运行一个函数。 [从对象中删除属性]
3)使用(2)的结果和长度来运行$ http请求循环到我们的服务器。 [或任何服务器]
4)这将产生6个不同的对象。在这6个对象上运行一个函数。 [添加房产]
5)完成所有这一切后,运行一个单独的功能[Log“finished”]
如何使用承诺实现这一目标?如何将数据从(1)通过承诺传递给(2)?这是实现我需要做的正确方法吗?
如果有人能告诉我这是如何构建的,那将是非常有帮助的;我为这个问题保持了尽可能简单的功能。
答案 0 :(得分:2)
是的,承诺非常适合为这类问题构建解决方案。
简化解决方案(或多或少的伪代码):
$http(...)
.then(function(response) {
// do something with response, for example:
var list = reponse.data.list;
// return it so that you can use it in the next 'then'.
return list;
})
.then(function(list) {
var promises = [];
angular.forEach(list, function(item) {
// perform a request for each item
var promise = $http(...).then(function(itemResponse) {
itemResponse.extraProperty = true;
return itemResponse;
});
// we make an array of promises
promises.push(promise);
});
// combine all promises into one and return it for the next then()
return $q.all(promises);
})
.then(function(itemsList) {
// itemsList is now an array of all parsed item responses.
console.log(itemsList);
});
(希望这是对的,我没有测试过。)
如您所见,您可以在回调中返回值以将其传递给下一个then(),或者您可以传递一个promise,这将导致在它解析时调用下一个回调。 $q.all()
用于将多个promises组合成一个,并解决所有问题的解决方法。
编辑:我意识到你可以选择省略这三行:
return list;
})
.then(function(list) {
但它的语法很好,因为任务的分离更加明显。
答案 1 :(得分:1)
不知道为什么你难以实现这一点,但也许$q.all()
是你错过的:
var config1={method:'GET',url:'/api/...'};
$http(config1).success(function(resultsFrom1){
functionForResultsOf1(resultsFrom1);
})
var functionForResultsOf1 = function(resultsOf1){
//remove something from the result, assuming this is a synchronous operation
resultsOf1.splice()...;
var promises=makePromises(*pass whatever you want*);
$q.all(promises).then(function(aggregateOfAllCallsToServer){
angular.forEach(aggregateOfAllCallsToServer,function(data){
//do something to data from each call to the server
})
console.log("finished");
})
}
var makePromises = function(serverUrls){
var promises = [];
angular.forEach(serverUrls, function(url) {
var promise=$http({
url : '/api/'+url,
method: 'GET',
})
promises.push(promise);
});
return $q.all(promises);
}
答案 2 :(得分:1)
检查下面的代码,它可能包含语法错误,重要的是结构。 Step3包含多个(6)$ http请求,它等待最后一个请求响应,返回一个包含每个$ http requets响应的唯一响应对象(数组)。
//Step 1
var Step1 = function () {
$http.get('api/controller').success(function (resp) {
var object1 = resp;
Step2(object1);
Step3(object1).then(function (resp) {
//resp.data is an array containing the response of each $http request
Step4(resp);
Step5();
});
});
}
//Step2
var Step2 = function(obj){
//do whatever with the object
}
//Step3
var Step3 = function (object1) {
var call = $q.defer();
var get1 = $http.get(object1[0].url);
var get2 = $http.get(object[1].url2);
//...
var get6 = $http.get(object[5].url6);
$q.all([get1, get2,..get6]).then(function (resp) {
call.resolve(resp);
});
return call.promise;
}
//Step4
var Step4 = function (resp) {
for (var i=0; i<resp.data.lenght;i++){
DoWhatEver(resp.data[i]);
};
}
//Step5
var Step5 = function () {
alert("Finished");
}
Step1(); //Call Step1 function