![](/img/trans.png)
[英]Run function after another function completes JavaScript and JQuery
[英]Javascript queue a function after another completes
我有一个长时间运行的函数A()。 而且我的函数B(){}可以随时调用。
注意,不必在A之后调用函数B。但是,如果调用了函数B并且正在运行A,则必须完成A。 然后运行B。
我考虑过promise.then(),但是不一定要在A之后调用B。因此在这种情况下它没有太大用处。
如何“排队” B以确保逻辑?
做这样的事情:定义一个变量var inQueue = 0
; 当A开始时,设置变量inQueue = 1
,完成时将其设置为inQueue = 0
。 现在放一张像
if(!inQueue) B();
这将确保B不会中断A。
使用一个变量, true
当A
正在运行并设置为false
,在结束A
。 在B
检查。 如果正在运行,请稍等片刻,然后再次致电B
var isARunning
A() {
isARunning = true
//do the things
isARunning = false
}
B() {
if (isARunning) {
setTimeout(() => { B() }, 1000);
}
else {
// do more things
}
}
不要使用标志! 它们是完全不必要的。
也不要在A()
或B()
做任何特殊的事情。 只需像平时执行任务一样写它们即可。
只需以动态更新的Promise链的形式实现队列。
var q_ = Promise.resolve();
function queue(fn) {
q_ = q_.then(fn);
return q_;
}
现在,您可以A
和B
或任何其他函数排队,如下所示:
queue(A);
queue(B);
queue(someOtherFunction);
或者,如果您需要传递参数:
queue(A.bind(null, 'a', 'b', 'c'));
queue(B.bind(null, 'x', 'y', 'z'));
queue(someOtherFunction.bind(null, 1, 2, 3));
作为奖励,
A()
和B()
(以及其他函数)仍然可以直接调用(未排队)。 queue()
函数是同步的还是异步的。 它将与任一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.