2015-02-09 71 views
1

(我的情况适用于C#,MVC,返回JSON,得到jQuery,角),但我期望它适用于更多。接收json异步响应的最有效方法?

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

有没有办法让一个调用,并返回结果,因为我有他们,他们得到相应的显示?我是否需要重复调​​用具有类似“IsMore = T”的布尔值并再次调用服务? (听起来不太有效)。

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

+0

您目前是否提出了7个HTTP请求,并且您只想制作一个请求? – 2015-02-09 02:12:12

+0

yes(对我的服务) - 但我希望在不显示第一个 – Jim 2015-02-09 02:14:31

+2

之前等待最后的数据〜10s如果向服务器发出七个异步请求,服务器可以并行处理所有七个请求并返回每个请求当它变得可用时的响应。每个响应到达时都会对您的客户做出反应。如果你提出一个请求,那么服务器发出一个响应,直到所有处理完成才会发生。您的服务器代码_could_将请求分成七个线程并进行处理,但这不必要地使服务器代码和客户端代码复杂化。除非您能证明网络延迟有问题,否则我会坚持7个请求。 – 2015-02-09 02:18:18

回答

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(),这将等到所有承诺解决。

+0

谢谢,它与此相反 - 我想要一次调用(优化调用),它会立即返回任何进来的东西,然后无论什么时候进入,直到最后,无需等待最后一件事情显示第一件事。另外,它们可能有不同的顺序,所以链接也不会以这种方式工作(即使它相反地工作)。 Hobo Sapiens的回复可能有效 - 我还没有发现网络丢失(它在Azure上,所以它是固定的),但是我有成千上万的客户端,经常刷新(缓存,但仍然)。可能很好。 – Jim 2015-02-09 04:40:04

0

Buildilng上@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 s和$ q.all之间的区别在于,在链接之下,一个请求在启动之前不会启动。