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

4

我有两个函数,第一个函数选择内容,另一个函数会带有延迟来对其进行评估,就像这样:

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

问题是,在第二个函数完成之前,选择功能应该被禁用。我知道完全暂停JavaScript是不可能的,但第一个函数在等待或严肃工作时触发会使一切混乱。我已经尝试将代码移动到其他函数并延迟这些函数,但没有任何效果。
提前感谢!

https://api.jquery.com/jquery.when/ - The Alpha
3个回答

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
处理这种情况的正确方法是使用 promises。我更喜欢使用 Q 库 (https://github.com/kriskowal/q),当然你也可以使用 jQuery。 假设你想运行 select,运行 evaluate 并使 select 在 evaluate 完成之前不可用:
 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();
}

1
我认为这个问题应该使用回调函数。回调函数是在另一个函数执行后执行的函数。这样,你就可以确保在其他函数运行后运行该函数。此外,你如何获取数据?许多 SQL 函数具有内置的回调函数,例如成功函数,你可以使用它来调用其他函数。你可能会陷入回调地狱,但你可以使用其他函数的回调来继续处理数据。
这里有一篇优秀的文章:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接