我有一个控制器,通过两个单独的http调用加载我的数据的不同属性。一个过于简化的例子是:
如果呼叫是同步的,我会做一些类似的事情:
- call service A and store Objects in a map keyed by Country name
- call service B, iterate over results: if a result in is the previous map, then update its population field
但当然我无法做到这一点,因为对服务B的调用可能会先返回,所以地图是空的。
我尝试过通过" $ broadcast" /" $ on"功能,但这并不一致,因为两个调用都是异步的(我在B完成时广播,并尝试将结果应用于A,但有时A还没有完成)。
我该怎么办?
答案 0 :(得分:1)
只需查看Chained Promises
即可答案 1 :(得分:1)
Promises 允许开发人员轻松地将响应的1x通知附加到任何异步请求/操作。 Promise还可以实现两(2)个其他非常重要的事情。我们可以:
在后续处理程序(链中)通知响应之前转换响应。 使用响应来调用更多异步请求(这可能会产生更多的承诺)。 但是比上述功能更重要的是,Promises支持轻松链接自定义活动或计算。管理异步活动的序列或链可能是一项非常困难和复杂的工作。承诺链是惊人的,并提供了轻松构建异步请求或异步活动序列的方法。
答案 2 :(得分:1)
var app = angular.module("app",[]);
app.factory('myService', function($http,$q) {
return {
getPerson: function(){
return $q.all([
$http.jsonp('http://filltext.com/?callback=JSON_CALLBACK&rows=10&delay=2&fname={firstName}&lname={lastName}'),
$http.jsonp('http://filltext.com/?callback=JSON_CALLBACK&rows=10&delay=2&fname={firstName}&city={city}')
]).then(
function(result) { return result }, /* SUCCESS */
function() { return "NaN" } /* FAILURE */
);
}
};
});