停止JavaScript中挂起的异步函数
Stop pending async function in JavaScript
这里有两个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调用以检查标志服务器端。
这是我唯一看到的东西。
- 如何在异步函数中使用javascript对象
- Meteor:异步函数回调异常:onAfterAction
- 未调用jquery异步函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何在异步函数中正确使用Promise.all()和then()
- 从异步函数返回值
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 如何在将Node异步函数转换为promise时使用Q库
- 如何在异步函数与Deferredjquery之间同步
- ng用异步函数模拟怪异行为
- 用mocha测试异步函数
- 用于异步函数中的循环和定时问题
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 嵌套异步函数未及时返回数据的问题
- 在异步函数中维护变量的状态
- 递归异步函数
- Bluebird promisifyAll不会创建整个异步函数集
- 递归调用异步函数
- 异步函数调用是否可以在两个同步语句之间完成
- 如何在nodejs中实现异步函数