在JavaScript中,無法使用sleep
函數暫停代碼執行。執行JavaScript代碼被設計爲非阻塞。
使用debugger
關鍵字的解決方案也適用於Chrome。您只需打開開發人員工具。
我準備的演示以不同的方式工作。它使用setInterval
模擬sleep
函數,並且不阻止腳本執行。但是,它涉及一些額外的代碼。
假設我們有初始代碼:
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
函數基本上創建了具有綁定到提供值的參數的新函數。有關MDN page的更多詳細信息。
例子:
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
循環內的代碼塊轉換爲函數。它簡化了一點轉換。
沒有更多的解釋說明你是通過「遍歷代碼的不同部分」,而不看你的代碼,很不幸,不是很多。 –
增加了一個例子 – blaze
你的意思是你正在尋找模態消息框,就像'alert()'創建的那樣? –