繁体   English   中英

Javascript将函数逐个完成

[英]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。

使用一个变量, trueA正在运行并设置为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_;
}

现在,您可以AB或任何其他函数排队,如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM