暂停javascript线程特定时间段

时间:2014-03-13 11:27:44

标签: javascript jquery

如何在某段特定时间内停止执行javascript? 使用setTimeout函数可以在延迟之后执行语句块,但在等待时间期间,正在执行setTimeout旁边的语句。我可以暂停此同步执行。

根据要求,我在for循环中有setTimeout函数。但是在等待时间内循环正在执行。

以下是示例代码:

for(i = 0;i < n;i++){
    setTimeout(function(){
        // Accessing the loop variable i inside this function
    },3000);
}

http://jsfiddle.net/KK2mq/2/

2 个答案:

答案 0 :(得分:1)

您可以使用闭包,以便使用i的正确值:

for (i = 0; i < 5; i++) {
    (function (i) {
        if (i % 2 == 0) setTimeout(function () {
            divId = document.getElementById("withTimeOut");
            divId.innerHTML += i+" ";
        }, 3000);
    })(i);
}
for (i = 0; i < 5; i++) {
    if (i % 2 == 0){
        divId = document.getElementById("withOutTimeOut");
        divId.innerHTML += i+" ";
    }
}

JSFiddle here
这会导致两个输出显示相同的值。但是你希望这些数字在3秒后出现吗?如果是这样,情况会有所不同。

如果您希望这些数字一个接一个地出现,您可以这样做:

(function display(i, step, max) {    
    setTimeout(function () {
        divId = document.getElementById("withTimeOut");        
        divId.innerHTML += i+" ";            
        i += step;        
        if(i <= max) display(i,step,max);
    }, 3000);    
})(0,2,4);    

JSFiddle

display函数是递归的,在显示前一个数字后每隔3秒调用一次,只要i <= 4。围绕整个事物的(...)(0, 2, 4)意味着立即使用参数(0, 2, 4)调用此函数。

答案 1 :(得分:0)

挂起我知道的线程的唯一方法是同步ajax,甚至已弃用。使用jQuery的样子:

useEffect(() => {
    firebase.auth().onAuthStateChanged(function (_user) {
    if (_user) {
      // User is signed in.
      // do some firestroe queryes to get all the user's data
      setUser(_user);
    } else {
      setUser({ exists: false });
    }
  });
}, []);

但是也许您可以像第一个答案那样延迟启动新的分离线程。使用ES6,您可以使用看起来很重要并保留上下文的协程。唯一的问题是主线程将继续运行,而不等待任何内容,但是具有延迟的计算将在另一个线程中并行进行。示例:

$.ajax("/quickOne?arg="+arg,{async:false,success:d=>result=d});