Javascript暂停 - 禁用一个函数,直到另一个完成

时间:2016-03-21 00:11:43

标签: javascript jquery pause

我有两个函数,第一个选择东西,另一个用延迟评估它,如下所示:

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

问题是,应该禁用选择功能,直到第二个完成。我知道完全暂停Javascript是不可能的,但是第一个功能触发而另一个正在等待或正在认真工作会使一切都搞乱。我已经尝试将代码转移到其他函数并延迟这些函数,但没有任何作用。

提前致谢!

3 个答案:

答案 0 :(得分:1)

谁说这不可能?您可以通过保存并跟踪其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
}

答案 1 :(得分:1)

我认为这个问题应该使用回调。回调是在执行另一个函数后要执行的函数。这样您就可以保证在其他人运行之后运行该功能。另外,你是如何得到数据的?许多SQL函数都内置了回调,即成功,可用于调用其他函数的函数。你最终可能会在回调地狱中,但你使用其他函数回调来继续处理你的数据。

这里的优秀文章:

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

答案 2 :(得分:1)

处理这种情况的正确方法是使用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();
}