在 JavaScript 中停止挂起的异步函数

Adr*_*det 3 javascript asynchronous

这里我有两个 JS 异步函数同时运行。

当一个结束时(回调已经运行),我想阻止另一个继续。但是(这是我的问题)我不能使用 global vars。然后,我想知道是否可以停止 JS 中的挂起函数或以任何方式解决我的问题。

我将不胜感激任何答案:)

编辑:

一些澄清:

  • 我在这里使用纯JS。没有提供 HTML。
  • 当我谈论异步时,它可能是每个异步函数,而不仅仅是 ajax(数据库、超时等)。
  • 我们不知道它们的运行时间。

关于代码,这是我想要生成的示例:

asyncFirst(
    // ... args
    function() { // callback
        console.log('foo');
        stopOther();
    }
);

asyncSecond(
    // ... args
    function() { // callback
        console.log('bar');
        stopOther();
    }
);

asyncFirst(...);
asyncSecond(...);
Run Code Online (Sandbox Code Playgroud)

不使用“状态”变量的 stopOther() 算法是什么?

Jar*_*ith 5

如果这些函数在同一范围内运行,您可以简单地设置一个标志变量并将其用作每个回调结束时的保护:

var flag = false;
function async1() {
    //check if other function is done
    if (!flag) {
        //do stuff
    }
    flag = true;
}

function async2() {
    //same structure as the first
}
Run Code Online (Sandbox Code Playgroud)

如果这些在全局范围内运行,您将需要使用 Paul S. 的 IIFE 建议

(function() {
    var flag = false;
    function async1() {
        //check if other function is done, if it is don't bother
        if (!flag) {
            //do stuff
        }
        flag = true;
    }
    function async2() {
        //ditto
    }
})();
Run Code Online (Sandbox Code Playgroud)

这将防止污染全局命名空间。请注意,javascript这里是单线程对您有帮助,因为这两个函数不能完全同时命中标志,因此只有其中一个会实际进行更改。另请注意, async1 && 2 不需要在同一范围内定义,但flag必须存在于调用它们的范围内。


Adr*_*det 5

不幸的是,如果不使用“state”变量,就无法停止异步运行的方法。一旦调用,方法就无法停止,即使使用非常“低级”的 JS 方法也是如此。

对于“state”变量,请检查 Jared Smith 的答案。