javascript - 在 AJAX/Javascript 中调用长时间运行的进程时如何更新 UI?

标签 javascript ajax

我有多个进程需要连续调用(我正在使用同步 AJAX 调用)。我想在完成后显示长时间运行的进程的状态,然后继续下一个进程。这是我编写的示例代码。

    var counter = 0;
function runProcess(input, output) {
    doWork();
    doWork();
    doWork();
};
function doWork() {
    counter++;
    document.getElementById('<%=this.progressMonitor.ClientID%>').innerHTML += "Running " + counter;

    // some lengthy calculations
    for (var i = 0; i < 1000000; i++) {
        var foo = Math.random();
    }
    setTimeout(updateStatus, 1000);
};
function updateStatus() {
    document.getElementById('<%=this.progressMonitor.ClientID%>').innerHTML += "Done " + counter;
}

当我运行它时,我得到以下响应:

运行 1 运行 2 运行 3 完成 3 完成 3 完成 3

我想得到

运行 1 完成 1 运行 2 完成 2 运行 3 完成 3

如果我在 updateStatus 函数中插入一个 alert() 语句,那么我会得到我想要的响应/执行顺序。浏览器是否为 3 个函数调用创建 3 个线程并异步执行它们?

我怎样才能连续运行它? setTimeout 是否正确执行?提前感谢您的帮助。

最佳答案

听起来您想对 AJAX 调用进行排队。 jQuery 提供了一个很好的队列函数,所以你可以确保一系列函数被一个接一个地调用。 Mootools 和其他框架提供类似的功能。

这是我的 fiddle 中的代码 展示了如何操作。

var queueElement = $("#output");
var counter = 0;

function doWork(next) {
    queueElement.append("Starting " + counter + "<br/>");
    counter++;
    $.ajax('/echo/json/').always(function() {
        queueElement.append("Ending " + counter + "<br/>");
        next();
    });
}

queueElement.queue('workQueue', doWork);
queueElement.queue('workQueue', doWork);
queueElement.queue('workQueue', doWork);
queueElement.dequeue('workQueue'); // start the work queue

关于javascript - 在 AJAX/Javascript 中调用长时间运行的进程时如何更新 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315405/

相关文章:

javascript - 如何使用指令动态更改模板?

javascript - 使用 ajax 发送 rowID 并将选定的行附加到新表

javascript - 如何设置带时区的倒计时?

javascript - 如何在 Bootstrap 插件中以货币格式显示输入字段中的数字?

Golang 中的 Javascript toISOString 时间

jquery - 从 iframe 中重新加载父窗口

javascript - Chrome 中 ajax Restful ws 调用期间访问 CORS

javascript - 从 Ajax 更改按钮加载 Bootstrap 模式

javascript - 如何在不刷新页面的情况下自动刷新多个php变量?我只能办理一台atm

javascript - 使用函数式方法进行对象转换