我有一个长时间运行的函数A()。我的函数B(){}可以随时调用。
注意在A之后不必调用函数B.但是如果调用它并且如果A正在运行,那么必须完成A.然后运行B。
我想到了promise.then(),但是可能不一定在A之后调用B.所以在这种情况下它没有多大用处。
如何'排队'B以确保逻辑?
答案 0 :(得分:1)
做这样的事情:
定义变量var inQueue = 0
;
当A开始时,设置变量inQueue = 1
,当它完成时,将其设置为inQueue = 0
。现在打一个像
if(!inQueue) B();
这将确保B不会中断A.
答案 1 :(得分:1)
在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
}
}
答案 2 :(得分:1)
不要使用旗帜!它们完全没必要。
在A()
或B()
中也不要做任何特别的事情。按照通常的方式写下它们来履行职责。
只需以动态更新的保证链形式实现队列。
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()
的函数是同步还是异步。它可以与之合作。<强> DEMO 强>