在JavaScript中停止等待异步函数

时间:2014-10-10 11:36:14

标签: javascript asynchronous

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

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

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

编辑:

一些澄清:

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

关于代码,以下是我想要制作的示例:

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

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

asyncFirst(...);
asyncSecond(...);

什么算法的stopOther()不使用'state'vars?

4 个答案:

答案 0 :(得分:2)

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

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必须存在于调用它们的范围内。

答案 1 :(得分:0)

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

对于'州' var,请查看Jared Smith的答案。

答案 2 :(得分:0)

出于我的需要,我使用了另一种方法。由于无法简单停止其他函数的代码运行,因此,如果我们仅保留对已完成的第一个函数的响应,那该怎么办(如果您的函数不修改作用域对象,就可以了)

可撤销的承诺

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

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

答案 3 :(得分:-2)

好吧,如果你不能使用全局变量,那就告诉你不要处理......

1)在隐藏的字段中放置一些内容并检查该值。

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

我唯一看到的东西。