簡體   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