这个答案可能有点烦人,但请耐心看完 :-).
由于Javascript通常在浏览器内运行,而浏览器是多线程的,其中Javascript可能占用了多个线程,因此没有像单线程程序中那样的“全局休眠”概念。
如果您想以任何合理的方式暂停操作,可以考虑以下方法。
假设您想要执行以下操作
function foo(s) {
var j = 1; var k = 1;
sleep(s);
window.alert("Sum is : " + (j+k));
}
实际上变成:
function foo(s) {
var j = 1 ; var k = 1;
setTimeout(s, function() {
window.alert("Sum is : " + (j+k));
});
}
当然问题在于从过程的角度来看,你可能希望有类似以下的内容:
function foo() {
do stuff;
pause();
do more stuff;
return;
}
function bar() {
foo(10);
window.alert("I want this to happen only after foo()");
}
问题在于,使用setTimeout并不能真正做到上面展示的那样。
但是你可以做这样的事情:
function foo(s, afterwards, afterparms) {
var j = 1 ; var k = 1;
setTimeout(s, function() {
window.alert("Sum is : " + (j+k));
afterparms.parm1 = afterparms.parm1.toUpperCase();
afterwards(afterparms);
});
}
function bar() {
foo(10, function() {
window.alert("This will happen after window.alert");
}, { parm1: 'hello', parm2: 'world' } );
}
请注意,以上仅是将信息传递给函数的一种方法,如果您查找函数调用约定、变量参数等内容,您可以做一些非常酷的事情。
如果您从程序化的角度思考,编程可能会很烦人。但是,有两件事情需要记住关于JavaScript。它既不是过程式语言,也不是面向对象语言。JavaScript是一种具有复杂事件管理模型的函数式语言。因此,您必须按照这些术语来思考。
这也是有道理的,因为典型的JavaScript机器是一个GUI(Web浏览器),通过设计不想完全阻止某些处理而尝试执行某些操作。想象一下,当页面正在进行某些操作时,浏览器完全锁定,您肯定会想掐死那个程序员。
JavaScript代码应该具有“fire-and-forget”的特性,如果必须等待事件发生才能继续,则应查看JavaScript事件模型。
虽然在处理一些琐碎的问题时这可能是不方便的编程方式,但很有可能您使用暂停等待的方式会遇到竞争条件,并且有更合适的方法来实现您尝试实现的“效果”。
如果您发布特定情况,可能会有更多信息提供,以解决这种情况。
干杯!
setInterval()
,但我对你的使用情况不是100%清楚。 - Nick Craver