我想從每秒一次更改 a 的值,但是當我使用此代碼時:
let btn = document.createElement("button");
function sleep (time) { // number of ms
return new Promise((resolve) => setTimeout(resolve, time));
}
btn.innerHTML = "Save", btn.onclick = function() {
var value = 0;
while (true){
sleep(1000).then(() => {if (value == 1){
document.getElementById("input").setAttribute('value', '1');
value = 1;
} else if (value == 2){
document.getElementById("input").setAttribute('value', '2');
value = 1;
} else if (value == 3){
document.getElementById("input").setAttribute('value', '3');
value = 1;
} else if (value == 4){
document.getElementById("input").setAttribute('value', '4');
value = 1;
} else if (value == 5){
document.getElementById("input").setAttribute('value', '5');
value = 1;
} else if (value == 6){
document.getElementById("input").setAttribute('value', '6');
value = 1;
} else if (value == 7){
document.getElementById("input").setAttribute('value', '7');
value = 1;
} else if (value == 8){
document.getElementById("input").setAttribute('value', '8');
value = 1;
} else if (value == 9){
document.getElementById("input").setAttribute('value', '9');
value = 1;
} else if (value == 0){
document.getElementById("input").setAttribute('value', '0');
value = 0;
}});
}
}, document.body.appendChild(btn);
標簽完全鎖定,我被迫重新加載它。我也嘗試過使用document.getElementById("input").value = "value";,但這會導致同樣的事情發生。有誰知道如何解決這個問題(表格沒有名稱)?
uj5u.com熱心網友回復:
問題是你有一個經典的“忙回圈”,它在執行 Javascript 代碼時鎖定了瀏覽器,而沒有給瀏覽器做任何其他事情的機會,比如更新 UI 或回應用戶操作。
您的while true回圈break內部沒有任何陳述句,只會永遠運行。每次運行時,您都會在其中放置一個 Promise - 的結果sleep(1000).then(...),但該 Promise 的解決方案永遠不會有機會被觀察到。不會在.then一秒鐘后自動發生,不管發生了什么——它只能在瀏覽器事件回圈安排它運行時發生,它在這里永遠不能這樣做,因為你有同步(阻塞)代碼永遠不會結束,但必須先運行。
如果您希望效果每秒運行一次,請不要打擾回圈,只需使用setInterval而不是setTimeout. 你甚至不想在這里使用 Promises,因為 Promises 在setInterval持續運行其處理程式時只能決議一次。所以你需要的是這樣的:
btn.onclick = function() {
var value = 0;
setInterval(function() {/* what you had in the .then goes here */}, 1000);
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472791.html
標籤:javascript 形式 循环
