javascript - 顺序函数调用

标签 javascript servlets settimeout sequential

我正在与一个更改并保存外部文件的 servlet 进行通信。由于这需要一些时间,我需要一些 javascript 函数调用按顺序发生,以便一个函数的操作不会干扰另一个函数的操作。

为此,我编写了一个“顺序”函数,它接受另一个函数,该函数只能在 busyflag 设置为 false 时调用(即,当没有其他函数调用同时处理时)。这是我的代码:

var busy = false;
function sequential(action) {
    while(busy)
        setTimeout(function(){sequential(action);}, 10);
    busy = true;
    action();
    setTimeout(function(){busy = false;}, 100);
}

function test1() {sequential(function() {alert("test1");});}
function test2() {sequential(function() {alert("test2");});}

this是 jsFiddle 上的例子。由于某种原因,这段代码在第二次调用时不断循环(当函数调用必须等待时)。

最佳答案

while(busy)
        setTimeout(function(){sequential(action);}, 10);

setTimeout 不会阻塞,它立即返回并允许循环继续。 JavaScript 是单线程的,因此这个循环只是继续运行并阻止任何其他代码执行,这意味着 busy 永远不会设置为 false 来退出循环。

假设您正在等待的这些事情是 ajax 调用,您可能需要使用某种队列,然后在 ajax 调用的回调中运行下一个请求。

关于javascript - 顺序函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10505176/

相关文章:

java - 为每个Web应用程序(上下文)保存一个存储库是更好还是通过JNDI或类似技术共享一个公共(public)实例更好?

javascript - servlet 过滤器中的静态资源版本控制(添加额外的 GET 参数)

javascript - settimeout 和cleartimeout 单击即可开始计时

javascript - 如何在返回函数中返回两个 map 值 - React js

java - Servlet中的Id解析错误

javascript - seTtimeout 为零秒

javascript - 在 GCP App Engine 中使用 NodeJs 和 Babel 的问题

javascript - 粘性导航栏在粘性后更改 CSS

JavaScript、移动等待栏、意外行为