延迟对象中的jquery间隔

时间:2018-04-25 09:24:30

标签: jquery ajax setinterval jquery-deferred clearinterval

我过去使用jQuery延迟对象没有问题,我理解它们是如何工作的。

我现在遇到了一种需要再次使用它们的新情况。

我有一些类似的函数,我添加到延迟数组。这些函数使用ajax每5秒获取一次值,直到计数器达到0

deferreds.push(
    getQueueCount()
);

function getQueueCount()
{
    var counter = 1,
        intervalId = setInterval(function() {
            if(counter > 0) {
                $.ajax({
                    type: 'POST',
                    url: 'path/to/script',
                    dataType: 'json',
                    data: {
                        'queuename': 'myqueue',
                        'total' : 10
                    },
                    success: function(response) {
                        $('#progress').width(response.width + "%").find('span').text(response.width + '%');
                        counter = response.size;
                    }
                });
            }
            else {
                clearInterval(intervalId);
                intervalId = null;
                counter = 1;

                return intervalId;
            }

        }, 5000);
}

但是,当我运行以下代码时,按钮已启用

$.when.apply($, deferreds).done(function() {
    $('#btn-sync').prop('disabled', false);
});

我的问题是如何在功能完成之前阻止按钮启用?当每个函数中的计数器达到0时,我需要将该函数归类为完全

1 个答案:

答案 0 :(得分:1)

我会这样做

function getQueueCount()
{
    var dfrQueue = new $.Deferred(),
        counter = 1,
        intervalId = setInterval(function() {
            if(counter > 0) {
                $.ajax({
                    type: 'POST',
                    url: 'path/to/script',
                    dataType: 'json',
                    data: {
                        'queuename': 'myqueue',
                        'total' : 10
                    },
                    success: function(response) {
                        $('#progress').width(response.width + "%").find('span').text(response.width + '%');
                        counter = response.size;
                    }
                });
            }
            else {
                dfrQueue.resolve('queue');
                clearInterval(intervalId);
                counter = 1;
            }

        }, 5000);

     console.log('initialize test for queue');
     return dfrQueue.promise();
}

$.when.apply($, deferreds).then(function(arg) {
    // all operations has completed and console out the argument provided by the last operation that completed.
    console.log('all process succeeded: ' + arg);
});