这里我有两个同时运行的JS异步函数。
当一个人已经结束(回调已经运行)时,我想阻止其他人继续前进。但是(这是我的问题)我不能使用全局变量。 然后,我想知道是否可以在JS中停止挂起函数或以任何方式解决我的问题。
我将不胜感激任何答案:)
编辑:
一些澄清:
关于代码,以下是我想要制作的示例:
asyncFirst(
// ... args
function() { // callback
console.log('foo');
stopOther();
}
);
asyncSecond(
// ... args
function() { // callback
console.log('bar');
stopOther();
}
);
asyncFirst(...);
asyncSecond(...);
什么算法的stopOther()不使用'state'vars?
答案 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调用以检查标志服务器端。
我唯一看到的东西。