2014-04-03 46 views
2

我有一个控制器,它通过两个单独的http调用加载我的数据的不同属性。一个过于简单的例子会是这样的:我应该如何在AngularJS中处理两个异步调用?

  • 一个国家类有属性的名称,官方语言,人口
  • 一个服务(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还没有完成)。

我应该在这里做什么?

+0

第一的回调只是执行第二功能? – tymeJV

回答

1

试想一下,在Chained Promises

+0

只是一个想法,你应该考虑编辑这个来展示一个例子。该视频非常有用,并且看起来这个标记不是答案并被删除。如果该链接断开,一个例子将确保它对仍有相同问题的未来访问者仍然有用。希望这可以帮助。 – jmort253

1

承诺让开发人员能够轻松连接1X只响应的通知任何异步请求/动作。承诺也使两(2)个其他非常重要的事情。我们可以:

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

参考 - Flattening Promise Chains

+0

你提到了不错的文章。 –

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 */ 
       ); 
      } 
     }; 
    }); 
相关问题