(我的情况适用于C#,MVC,返回JSON,得到jquery,angular),但我希望它适用于更多。
我有一个网站,我的angular / html / js通过Angular控制器和异步获取/显示数据(天气,道路状况等)调用~7个服务。其中一些比其他时间更长(从ms到~10s)。我想对我的服务进行一次调用,返回所有这些数据 - 但不会等到最后一次调用返回任何内容(10s)。
有没有办法进行一次通话,并按照我的方式返回结果并相应地显示?我是否需要重复调用,其中包含一个类似于" IsMore = T"的布尔值。并再次调用该服务? (听起来效率不高)。
理想情况下,我希望保持响应通道打开并保持抽取结果,直到完成为止。可能的?
答案 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之间的区别在于,在链接下,一个请求在收到前一个请求之前不会启动....