停止JavaScript中挂起的异步函数

Stop pending async function in JavaScript

本文关键字:异步 函数 挂起 JavaScript 停止      更新时间:2023-09-26

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

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

我将感谢任何答案:)

编辑:

一些澄清:

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

关于代码,这里有一个我想制作的示例:

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

在不使用"state"变量的情况下,stopOther()的算法是什么?

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

var flag = false;
function async1() {
    //check if other function is done
    if (!flag) {
        //do stuff
    }
    flag = true;
}
function async2() {
    //same structure as the first
}

如果这些在全球范围内运行,您需要使用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
    }
})();

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

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

关于"state"var,请查看Jared Smith的回答。

为了满足我的需求,我使用了不同的方法。由于无法简单地停止另一个函数的代码运行,如果我们只对第一个完成的函数保持响应(如果您的函数不修改作用域对象,应该没问题)

可取消承诺

let firstResponse = await new Promise(function(resolve, reject) {
    async1().then(resolve, reject);
    async2().then(resolve, reject);
});
console.log(firstResponse); // => the first returned value of both functions

像这样,您的脚本不会被阻止。这不是您确切问题的最终解决方案,但在某些情况下可能会有所帮助:)

好吧,如果你不能使用全局var,那么告诉你不要处理。。。

1) 把一些东西放在一个隐藏的字段中,然后检查该值。

2) 进行ajax调用以检查标志服务器端。

这是我唯一看到的东西。