最有效的方式来接收json异步响应?

时间:2015-02-09 02:04:13

标签: javascript json asp.net-mvc angularjs

(我的情况适用于C#,MVC,返回JSON,得到jquery,angular),但我希望它适用于更多。

我有一个网站,我的angular / html / js通过Angular控制器和异步获取/显示数据(天气,道路状况等)调用~7个服务。其中一些比其他时间更长(从ms到~10s)。我想对我的服务进行一次调用,返回所有这些数据 - 但不会等到最后一次调用返回任何内容(10s)。

有没有办法进行一次通话,并按照我的方式返回结果并相应地显示?我是否需要重复调​​用,其中包含一个类似于" IsMore = T"的布尔值。并再次调用该服务? (听起来效率不高)。

理想情况下,我希望保持响应通道打开并保持抽取结果,直到完成为止。可能的?

2 个答案:

答案 0 :(得分:0)

我不确定我完全理解,但我认为你可以将响应承诺链接在一起,例如:

$scope.getWeatherData = function () {
  return myWeatherService.get().then(function (resp) {
    $scope.weatherData = resp;   
  });
}

$scope.getTrafficData = function () { 
  return myTrafficService.get().then(function (resp) {
    $scope.trafficData = resp;
  });
}

$scope.getWeatherData.then(getTrafficData).then(...chain others...);

这假设服务调用返回$http承诺。

无论如何,每当承诺进入时,数据都将在$scope上,因此显示将随着承诺的到来而更新。听起来你可能正在使用像$q.all()这样的东西,它会等到所有的承诺都解决了。

答案 1 :(得分:0)

建立@ reptilicus'回答:

$scope.getWeatherData = function () {
  return myWeatherService.get().then(function (resp) {
    $scope.weatherData = resp;   
  });
};

$scope.getTrafficData = function () { 
  return myTrafficService.get().then(function (resp) {
    $scope.trafficData = resp;
  });
};

$q.all([
  $scope.getWeatherData(), 
  $scope.getTrafficData()
]).then(function () {
 // do whatever's next, or nothing
});

...将同时请求/接收两个响应(如果这是你想要的)。收到相关回复时,将填充每个请求的相关$ scope属性,并且"做下一步"代码将在完成后运行。

注意,您需要向控制器构造函数注入$ q才能使其正常工作。 :)

编辑:我刚注意到@reptilicus确实提到了$ q.all。链接.then和$ q.all之间的区别在于,在链接下,一个请求在收到前一个请求之前不会启动....