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

Most efficient way to receive json async responses?

本文关键字:有效 方式 响应 json 异步 接收      更新时间:2023-09-26

(我的例子适用于C#、MVC、返回JSON、get-jquery、angular),但我希望它适用于更多。

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

有没有一种方法可以打一个电话,并在我有结果时返回结果,并相应地显示结果?我是否需要一个具有类似"IsMore=T"的布尔值的重复调用,然后再次调用该服务?(听起来效率不高)。

理想情况下,我希望保持一个响应通道的开放,并保持泵送结果,直到它完成。可能的

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

$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承诺。

不管怎样,无论何时promise出现,数据都将在$scope上,因此显示将随着promise的到来而更新。听起来您可能正在使用类似$q.all()的东西,它会等到所有承诺都得到解决。

构建@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的区别在于,在链接下,一个请求直到收到前一个请求才会启动。。。。