如何在某段特定时间内停止执行javascript?
使用setTimeout
函数可以在延迟之后执行语句块,但在等待时间期间,正在执行setTimeout
旁边的语句。我可以暂停此同步执行。
根据要求,我在for循环中有setTimeout
函数。但是在等待时间内循环正在执行。
以下是示例代码:
for(i = 0;i < n;i++){
setTimeout(function(){
// Accessing the loop variable i inside this function
},3000);
}
答案 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});