4

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

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

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

提前致谢!

4

3 回答 3

1

处理这种情况的正确方法是使用 Promise。我更喜欢使用 Q 库 ( https://github.com/kriskowal/q ),当然你也可以使用 jquery。假设您要运行选择,运行评估并禁用选择,直到评估完成:

 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();
}
于 2016-03-21T00:36:05.907 回答
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
}
于 2016-03-21T00:16:20.447 回答
1

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

优秀的文章在这里:

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

于 2016-03-21T00:17:53.987 回答