用户可以选择一个月(+1个月点击,-1个月点击)
每次点击都会执行选择月份天数的循环。
在循环内部有一个从$ http请求中获取数据的函数。
问题是:(例子)
-Page加载:var data = [];
- 时间1:用户点击1月:
31 $ http请求,15个回调出来。
data.length = 15;
时间2:用户点击2月份
变量初始化var data = []
从上个月开始有16次回调,从2月开始有30次回调。
当用户点击另一个月时,我想要一种停止回调的方法......
这是一个更好理解的基本小提琴 http://jsfiddle.net/36qp9ekL/318/
答案 0 :(得分:0)
对不起,小提琴错了......
我猜您的请求不如一个请求快。但由于角度是异步的,你不会等待"在你的next()和previous()函数中,当你点击足够快时它们会相互重叠。 然后它将返回"休息"从前几天离开并执行该月的下一天。 您需要在此处使用promises或更改您的程序结构。
编辑:
你需要注入$ q
承诺示例
$scope.next = function(){
date.setDate(date.getDate() + 1);
$scope.data = [];
// disable previous and next button
$scope.loadData().then(function(allDayRequestResults) {
$scope.data = allDayRequestResults;
// enable previous and next button
}).catch(function(error) {
// handle http request error here
});
};
$scope.loadData = function(){
var promises = [];
for(var i = 1; i <= daysInMonth(); i++){
promises.push(getData(i));
}
return $q.all(promises);
};
function getData(i){
var deferred = $q.defer();
$http(<yourHttpOptions>)
.success(function(result) {
deferred.resolve(result);
})
.error(function (data, status, headers, config) {
console.log('$http-error:' + data + status + headers + config);
deferred.reject('Error occured while retrieving day '+ i);
});
return deferred.promise;
}
到目前为止,Untestet ......
答案 1 :(得分:0)
我同意请求1回调,响应时间为30天是更好的解决方案,但我相信这对其他应用程序非常有用。
这未经过测试,但显示了继续进行的方式。 全局变量是我找到的解决方案,因为承诺不是交叉浏览器。
C.CString()