簡體   English   中英

Javascript暫停 - 禁用一個函數,直到另一個完成

[英]Javascript pause - disable a function until another one finishes

我有兩個函數,第一個選擇東西,另一個用延遲評估它,如下所示:

function select() {
    // selecting stuff
    window.setTimeout(evaluate, 1000);
}
function evaluate() {
    // evaluating stuff
}

問題是,應該禁用選擇功能,直到第二個完成。 我知道完全暫停Javascript是不可能的,但是第一個功能觸發而另一個正在等待或正在認真工作會使一切都搞亂。 我已經嘗試將代碼轉移到其他函數並延遲這些函數,但沒有任何作用。

提前致謝!

誰說這不可能? 您可以通過保存和跟蹤其ID來檢查計時器當前是否正在運行:

var timeout = null;
function select() {
    if( timeout ) { // check if the timer ID is set
        return;
    }
    // selecting stuff
    timeout = window.setTimeout(evaluate, 1000); // return the ID of the timer
}
function evaluate() {
    // evaluating stuff
    window.clearTimeout(timeout); // clear the timer ID
    timeout = null; // reset the timer ID
}

我認為這個問題應該使用回調。 回調是在執行另一個函數后要執行的函數。 這樣您就可以保證在其他人運行之后運行該功能。 另外,你是如何得到數據的? 許多SQL函數都內置了回調,即成功,可用於調用其他函數的函數。 你最終可能會在回調地獄中,但你使用其他函數回調來繼續處理你的數據。

這里有優秀文章:

http://dreamerslab.com/blog/en/javascript-callbacks/

處理這種情況的正確方法是使用promises。 我更喜歡使用Q庫( https://github.com/kriskowal/q ),但是當然你也可以使用jquery。 假設您要運行select,運行評估並禁用select,直到評估完成:

 var deferred = jQuery.Deferred();

 function select() {
     if (deferred.state() === "pending") {
      console.log("Evaluate not finished");
    } else {
       // select stuff
        evaluate(deferred.promise());
    }
}

function evaluate(promise) {
    // evaluating stuff
    promise.resolve();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM