我应该如何在AngularJS中处理两个异步调用?

时间:2014-04-03 18:06:45

标签: javascript angularjs asynchronous

我有一个控制器,通过两个单独的http调用加载我的数据的不同属性。一个过于简化的例子是:

  • 具有属性名称,官方语言和人口
  • 的国家/地区类
  • 返回国家及其语言的一项服务(A)
  • 返回国家及其人口的另一项服务(B)
  • 让我们假设在B中返回的国家/地区集合是A中返回的国家/地区的一部分,我不会提前知道任何一个国家/地区
  • 我想最终得到一系列国家/地区对象 - 所有由A返回的国家/地区设置其人口(根据B返回的数据)

如果呼叫是同步的,我会做一些类似的事情:

- 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还没有完成)。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

只需查看Chained Promises

即可

答案 1 :(得分:1)

Promises 允许开发人员轻松地将响应的1x通知附加到任何异步请求/操作。 Promise还可以实现两(2)个其他非常重要的事情。我们可以:

在后续处理程序(链中)通知响应之前转换响应。 使用响应来调用更多异步请求(这可能会产生更多的承诺)。 但是比上述功能更重要的是,Promises支持轻松链接自定义活动或计算。管理异步活动的序列或链可能是一项非常困难和复杂的工作。承诺链是惊人的,并提供了轻松构建异步请求或异步活动序列的方法。

参考 - Flattening Promise Chains

答案 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 */
                );
            }
        };
    });