停止回调函数Javascript

Stop Callback function Javascript

本文关键字:Javascript 函数 回调      更新时间:2023-09-26

用户可以选择一个月(+1月点击,-1月点击)

每次点击按所选月份的天数循环执行。
在循环中有一个从$http请求中获取数据的函数。

问题是:(示例)
-页面加载:var data = [];

时间1:用户在一月点击:
$http请求31次,回调15次。
data.length = 15;

时间2:用户在二月点击。
变量初始化var data = []
16个来自上个月的回调,加上2月份的30个。

我想要一种方法来停止回调当用户点击另一个月…

这是一个基本的小提琴,以更好地理解
http://jsfiddle.net/36qp9ekL/318/

啊,好吧,对不起,小提琴错了…

我猜你的请求没有一个请求快。但是,由于angular是异步的,你不需要在next()和previous()函数中"等待",当你点击得足够快时,它们会相互重叠。然后,它将返回前几天剩余的"rest",并执行该月的后几天。你需要在这里使用承诺或者改变你的程序结构。

编辑:

你需要注入$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;
}

我同意请求1回调并在30天内响应是一个更好的解决方案,但我相信这对其他应用程序可能很有用。

没有经过测试,但显示了继续进行的方法。全局变量是我找到的解决方案,因为承诺不是跨浏览器的。

<button ng-click="load()"> Load data 1.000 times </button>
<script>
var callback = true;
var count = 0;
function ajaxRequest(i){
   //AJAX REQUEST
   .success(function(){
       count++;
       if(count == 1000){
         callback = true;
         count = 0;
       }
    });

}
$scope.load = function(){
   if(callback){
     callback = false;
     for(var i = 0; i < 1001; i++){
        ajaxRequest(i);
     }
   }
}
</script>