在 JavaScript 中,无法使用sleep
函数暂停代码执行。执行 JavaScript 代码被设计为非阻塞的。
使用debugger
关键字的解决方案也适用于 Chrome。你只需要打开开发者工具。
我准备了以不同方式工作的演示。它使用模拟sleep
功能setInterval
并且不阻止脚本执行。但是,它涉及一些额外的代码。
假设我们有初始代码:
var arr = [0, 1, 2, 3, 4];
function step(val) {
console.log(val);
}
for (var i = 0, len = arr.length; i < len; i++) {
step(arr[i]);
}
现在,我们想重写它,以便每个日志在一秒钟后显示:
var arr = [0, 1, 2, 3, 4],
steps = [];
function step(val) {
console.log(val);
}
for (var i = 0, len = arr.length; i < len; i++) {
steps[i] = step.bind(null, arr[i]);
}
var int = setInterval(function() {
var fun = steps.shift();
if(!fun) {
clearInterval(int);
return;
}
fun();
}, 1000);
让我稍微解释一下。首先,我定义steps
数组,在其中放置带有绑定参数的新函数。bind
function 基本上使用绑定到提供的值的参数创建新函数。MDN 页面上的更多详细信息。
例子:
function step(a) { console.log(a); }
var step1 = step.bind(null, 1);
// now step1 is like `var step1 = function() { console.log(1); }`
在for
循环中,我使用bind
. 最后一步是从steps
数组中提取这些函数,从头开始(使用Array.prototype.shift
方法),并以等于 1 秒的间隔执行它们。
我知道这不是您问题的直接解决方案,但我希望它可以帮助您正确转换代码。如果您决定这样做,我建议将内部的代码块for
和while
循环转换为函数。它稍微简化了转换。