javascript:等待使用setInterval函数的结果

javascript: wait for result of function that uses setInterval

本文关键字:函数 结果 setInterval 等待 javascript      更新时间:2023-09-26

我想要的是:

调用函数check_and_wait()来测试一个条件是真还是假。它将在指定的时间内以设定的间隔进行检查/循环。

程序的其余部分必须等待此测试的结果。这是出问题的部分。它不需要使用setInterval,这只是它现在的实现方式。

function test_condition(){
    // do some test. return true or false
}
function check_and_wait(){
    var maxtime = 3000;
    var  start = new Date().getTime();
    condition = false;
    var interval = setInterval(function() {
        if(condition){return true;}
        else{
            if(  new Date().getTime() - start < maxtime ){
               condition = test_condition();
            }
            else{return false;}
        }
    }, 250); 
}
result = check_and_wait();
if(result){
    //do something
}
else{
     //do something else
}

如何使用回调呢?使用异步事件要容易得多:

function check(finishCallback, waitingCallback) {
    var maxtime = 3000;
    var start = new Date().getTime();
    condition = false;
    var interval = setInterval(function() {
        if (condition) { 
            finishCallback(); 
        }
        else {
            if (new Date().getTime() - start < maxtime ) {
                condition = test_condition();
            } else {
                waitingCallback(); 
            }
        }
    }, 250); 
}

然后:

check(function() {
    //do something
}, function() {
    //do something else
});

处理异步进程时应该考虑使用回调函数。例如,在您的情况下,它可以是:

function check_and_wait(callback) {
    var maxtime = 3000;
    var  start = new Date().getTime();
    var interval = setInterval(function() {
        if (new Date().getTime() - start < maxtime ){
            if (test_condition()) {
                clearInterval(interval);
                callback();
            }
        }
    }, 250);
}
check_and_wait(function() {
    // do something
});

当条件发生变化时,你可以使用一个会爆发的回调:

var interval;
function check_and_wait(){
    var maxtime = 3000;
    var  start = new Date().getTime();
    condition = false;
    interval = setInterval(function() {
        if(!condition)
            if(  new Date().getTime() - start < maxtime ){
               condition = test_condition();
            }
        }
        else {
           callback();
        }
    }, 250); 
}
function callback() {
     clearInterval(interval);
     // do the stuff you do when you're ready
}