Javascript jQuery然后在间隔

时间:2015-04-16 09:31:06

标签: javascript jquery jquery-deferred

如果作业完成,我会检查服务器。我不想向服务器发送垃圾邮件,这就是为什么我会使用setInterval。

我调用触发器功能,当在服务器上完成作业时(可能在完成之前完成2-3次调用),该功能完成。

我知道我可以在区间内调用我的finishFunction并解决它。但我想返回它,因为我从另一个js文件调用触发器函数。如果可能的话,我想在那里处理它。

function trigger() {
    var response = startInterval();
    response.then(function() {
        //done finishFunction()
    });
}

function checkServer() {
    var obj = { test: true }
    var respons = $.ajax({
        url: "MyUrl",
        data: JSON.stringify({ obj: obj }),
        type: "POST",
        contentType: "application/json",
        dataType: "JSON",
        cache: false
    });
    return respons;
}

function startInterval() {
    var inProgress = false;
    var interval = setInterval(function () {
        if (!inProgress) {
            inProgress = true;
            var response = checkServer().then(function (data) {
                var isDoneInQueue = JSON.parse(data.d);
                if (isDoneInQueue) {
                    //finishFunction()???
                    clearInterval(interval);
                    return response;
                };

                inProgress = false;
            });
        }
    }, 1000);
}

1 个答案:

答案 0 :(得分:3)

从函数返回Deferred对象,并在服务器作业完成后解析它:

function startInterval() {
    var result = $.Deferred();
    var inProgress = false;
    var interval = setInterval(function () {
        if (!inProgress) {
            inProgress = true;
            checkServer().then(function (data) {
                var isDoneInQueue = JSON.parse(data.d);
                if (isDoneInQueue) {
                    clearInterval(interval);
                    result.resolve(data);
                };
                inProgress = false;
            });
        }
    }, 1000);
    return result;
}

无论您使用resolve方法调用什么,都会发送到您使用then方法的函数:

function trigger() {
    startInterval().then(function(data) {
        //done finishFunction()
    });
}