3

我有一个 Ajax 请求正在等待另一个进程的响应。

function test() {
    var flag = 0;
    while (flag === 0) {
        $.ajax({
            url: "cs/CheckForProcess",
            async: false,
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                    flag = 1;
                } else {
                    $('#results').html('<h1>Processing...</h1>');
                    setTimeout(function() {
                    }, 6000);
                }
            }
        });
    }
}

问题是 setTimout 不起作用,尽管我在调试模式下看到执行 else 条件。


编辑:我希望在验证进程未准备好后仅 6 秒发送下一个 ajax 请求。

我错过了什么?谢谢。

4

3 回答 3

9

setTimeout 是一个异步函数。它不会暂停您的脚本。您的脚本将继续运行(6000 毫秒后您的 setTimeout 回调函数将执行)。

您可以考虑使用 setInterval 继续检查您的其他条件是否为真。

您可以通过在其他地方跟踪服务器响应来删除 async:false 。一旦你有一个成功的回调,那么你应该取消间隔。

function test() {
    var timerId = 0,
    timerId = setInterval(function(){
        $.ajax({
            url: "cs/CheckForProcess",
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                    clearInterval(timerId);
                }
            }
        });
    }, 6000)
}
于 2013-11-03T17:56:49.980 回答
3

Javascript 无法使用 setTimeout 休眠(例如暂停或阻止 javascript 执行)。

AsetTimeout()安排一个函数在将来的某个时间运行,而其他 javascript 只是在此期间愉快地继续运行。

setTimeout()如果数据尚未准备好,您应该做的是使用安排下一次运行 ajax 函数。因此,当没有数据准备好时,您将下一个 ajax 调用安排在 6 秒后,但是当您获得数据时,您只需处理数据就完成了。

此外,您真的不想使用async: false,因为它会在 ajax 调用期间冻结浏览器(不允许进行任何其他处理)。可以编写相同的操作来利用 ajax 的异步特性并允许您仍然解决问题,但允许其他处理在浏览器中继续,而不会阻止浏览器。这需要异步编程技术。

你可以这样做:

function test() {

    function runIt() {
        $.ajax({
            url: "cs/CheckForProcess",
            async: true,
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                } else {
                    // if data not ready yet, then put up some progress
                    // and call this again in 6 seconds
                    $('#results').html('<h1>Processing...</h1>');
                    setTimeout(runIt, 6000);
                }
            }
        });
    }

    // start the first iteration
    runIt();
}
于 2013-11-03T17:57:17.050 回答
0

setTimeout函数需要function在超时后执行。您正在传递一个空函数。因此,在 6 秒后,该空函数正在执行 - 显然没有做任何事情。

我认为您希望setTimeout延迟页面上其他脚本的执行。情况并非如此,因为setTimeout延迟并function在新线程中执行提供的回调(不会阻止页面上的其他执行)。

如果您在 6 秒后尝试执行某项操作,只需在function() {}您拥有的代码中提供代码即可。例如:

setTimeout(function() {
    $.ajax(...);
}, 6000);

或者

setTimeout(runIt, 6000);

链接:
setTimeout 文档 (mozilla)
相关的 SO 问题

于 2013-11-03T18:07:31.933 回答