![](/img/trans.png)
[英]How to Wait on Async function inside array.forEach in Javascript
[英]Javascript array.forEach(function) executing function twice as many times as expected
我有一個帶有單個按鈕的html文件
<!DOCTYPE html>
<html> <body>
<p>Click the button to list all the items in the array.</p>
<button onclick = "numbers.forEach(myFunction)" >Try it</button>
<p id="demo"></p>
</body>
</html>
我也有一個Javascript文件,其中包含.forEach
方法的onclick
函數。
單擊按鈕后,我要遍歷數組,遍歷數組中元素的每個實例。
對於此數組中的每個元素,我想在以后使用計時器輸出其索引和值,該計時器等待一秒鍾以顯示下一個排列。
demoP = document.getElementById("demo");
var numbers = [];
var random = Math.floor(Math.random() * 4) + 1;
numbers.push(random);
function myFunction(item, index) {
random = Math.floor(Math.random() * 4) + 1;
numbers.push(random);
demoP.innerHTML = demoP.innerHTML + "numbers[" + index + "]: " + item + "<br>";
//demoP.innerHTML = demoP.innerHTML + "<br>" //add magic spacing between permutation
sleep(100);
//switch to this and see how slow?
//sleep(1000);
}
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
我希望用戶單擊按鈕時顯示的結果是:
numbers[0] = 4
//waits a second and adds a <br> here to separate
numbers[0] = 4
numbers[1] = 2
//waits a second and adds a <br> here
numbers[0] = 4
numbers[1] = 2
numbers[2] = 3
等等。
當前,代碼輸出的元素至少是其兩倍,並且sleep()似乎比應該保留的時間更長。
除了可怕的sleep
功能。 您將myFunction
用作forEach
的回調,並在myFunction
,將新元素推入numbers
,該numbers
與您在其上調用forEach
數組相同。
forEach
仍將循環數組時,不會在新推送的項目上調用回調。 但是到循環結束時,數組中的項將增加一倍。 根據MDN:
由
forEach()
處理的元素范圍是在第一次調用callback
之前設置的。 在開始調用forEach()
之后追加到數組的元素將不會由callback
進行訪問。
如果數組包含N
元素,則在單擊時將顯示N
元素,而myFunction
將推入其他N
個元素,而在下次單擊時,這次將顯示2N
元素,...
因此,每次單擊后,數組中的元素將加倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.