Javascript在一个又一个完成后排队

时间:2017-05-10 20:07:55

标签: javascript jquery

我有一个长时间运行的函数A()。我的函数B(){}可以随时调用。

注意在A之后不必调用函数B.但是如果调用它并且如果A正在运行,那么必须完成A.然后运行B。

我想到了promise.then(),但是可能不一定在A之后调用B.所以在这种情况下它没有多大用处。

如何'排队'B以确保逻辑?

3 个答案:

答案 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_;
}

现在您可以将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()的函数是同步还是异步。它可以与之合作。

<强> DEMO