![](/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.