这个答案可能有点烦人,但很简单:-)。
由于 javascript 通常在浏览器中运行,浏览器是多线程的,其中 javascript 可能占用多个线程,因此没有像在单线程程序中那样“全局休眠”的概念。
如果您想以任何合理的方式暂停操作,您可能需要考虑以下事项。
假设你想要以下
function foo(s) {
var j = 1; var k = 1;
sleep(s); // This would be nice right?
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(网络浏览器),它在设计时不想在尝试处理某些东西时完全阻塞。想象一下,当页面正在执行某项操作时,您的浏览器完全锁定,您想要扼杀对您执行此操作的程序员。
Javascript 代码应该具有“即发即弃”的性质,如果事情必须等待事件发生才能继续,那么您应该查看 javascript 事件模型。
虽然当您想要做一些琐碎的事情时,这不方便编程,但您可能会使用暂停等待的方式可能会遇到竞争条件,并且有一种更合适的方式来处理“您试图达到的效果”。
如果您发布您的特殊案例,可能会有更多关于如何解决这种情况的信息。
干杯,