停止回调函数Javascript

时间:2015-05-27 09:46:25

标签: javascript angularjs

用户可以选择一个月(+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/

2 个答案:

答案 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()