有没有人知道如何在系统读取下一行之前在javascript中进行睡眠?
示例:
1 var chkResult = Validation();
2 //sleep here for for 10 sec before the next line been read
3
4 document.getElementById('abc').innerHTML = chkResult;
对于这个例子,如何让javascript在继续读取第4行之前在第2行中休眠/等待10秒?我曾尝试过setTimeout('',10000);但它似乎对我不起作用......
答案 0 :(得分:16)
I Have the Hat给出了正确的提示。使用setTimeout
method在10秒后执行第四行代码:
var chkResult = Validation();
var timeout = window.setTimeout(function() {
document.getElementById('abc').innerHTML = chkResult;
}, 10000);
如果您想要clear a timeout,可以将超时ID存储在变量中。
答案 1 :(得分:5)
尝试
setTimeout(function() { return true; }, 10000);
第一个参数需要一个函数。这是来自记忆;我还没有测试过。
编辑: Gumbo说的......在这里很晚......不确定我在想什么。
答案 2 :(得分:3)
1 var chkResult = Validation();
2 alert("wait ten seconds, then press ok");
3
4 document.getElementById('abc').innerHTML = chkResult;
前面的代码将睡眠任务委托给并行处理器。这有点乱,因为你必须使用DSL来进行这种线程化。
答案 3 :(得分:2)
setTimeout在JavaScript解释器中启动一个单独的执行“线程”。你需要传递一个函数并设计你的脚本,使得setTimeout运行的函数将在调用函数停止的地方继续 - 从而模拟睡眠。
答案 4 :(得分:1)
在JavaScript将控制权交还给浏览器之前不会发生延迟,所以第4行将在setTimeout开始之前执行。
你应该根据事件做好一切。
答案 5 :(得分:0)
我可以建议将其作为通用解决方案:
function sleep (ms, args, obj) {
/* Called at the top of a function to invoke a delay in processing that
function
Returns true if the function should be executed, and false if the sleep
timer is activated.
At the end of the sleep tiemout, the calling function is re-called by
calling it with "apply (obj, args || [])".
*/
var caller = sleep.caller;
if (caller.sleepTimer) {
/* if invoked from timeout function, delete timer and return false */
delete caller.sleepTimer;
return true;
}
/* Create timer and re-call caller at expiry */
caller.sleepTimer = window.setTimeout (function () {
caller.apply (obj || null, args || []);
},ms);
return false;
}
使用示例:
function delayed () {
if (!sleep (5000)) return;
document.body.innerHTML += "<p>delayed processing</p>";
}
function delayed_args (a, b) {
if (!sleep (10000, arguments)) return;
document.body.innerHTML += "<p>args : (" + a + ", " + b + ")</p>";
}
function delayed_method_args (a,b) {
if (!sleep (20000, arguments, this)) return;
document.body.innerHTML += "<p>method_args " + this + " (" + a + ", " + b + ")</p>";
}
在Opera和Firefox 3.0上测试
答案 6 :(得分:0)
Javascript必须与浏览器共享该线程,因此您想要的那种暂停看起来非常像浏览器被冻结10秒,是否可能。 “alert”和“prompt”等功能可以做到这一点。为此,它们是邪恶的,因为循环中的单个警报可以使整个浏览器瘫痪,唯一的出路就是强制退出它。
解决这个问题的方法是基于事件的范例。 Javascript具有一流的功能,因此它们可以作为“回调”的值传递,您可以将其分配给某些事件。
setTimeout就是这样一个事件。其他人已经发布了代码,但总的来说,你只想将你的功能分配给某些事件,然后避开浏览器,这样它就可以开展其浏览业务。浏览器会在发生事情时让您知道,并且您可以快速做出适当的响应,然后重新开始。通过这种方式,浏览器可以保持响应的外观。
如果您想了解更多信息,请查看以下问题: How is GUI and Game Program Flow compared to Web programs
答案 7 :(得分:0)
但是这样,您的线条线将在第4行之前执行
答案 8 :(得分:0)
JS中没有睡眠功能。
但是,您可以使用setTimeout:
var chkResult = Validation();
setTimeout(() => { document.getElementById('abc').innerHTML = chkResult }, 10000);
一种更现代的方法是使用promise和异步函数:
const doThis = () => document.querySelectorAll('p')[0].innerHTML ='Do this';
const doThat = () => document.querySelectorAll('p')[1].innerHTML ='Do that';
const doAlsoThat = () => document.querySelectorAll('p')[2].innerHTML ='Do also that';
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// using async function
(async () => {
doThis(); // executed at t=0s (approx)
await sleep(1000);
doThat(); // executed at t=1s (approx)
})();
// using promises
sleep(2000).then(doAlsoThat); // executed at t=2s (approx)
<p></p>
<p></p>
<p></p>