2017-12-08 19 views
1

내가 그것에 단일 버튼 HTML 파일이 예상 (기능) 배의 시간 함수를 실행자바 array.forEach

<!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> 

I 또한 .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()은 필요한 것보다 오래 지속되는 것으로 보입니다.

+4

'휴면'기능을 추가하지 마십시오. 대신'setTimeout'이나'setInterval'과 같은 것을 통해 asyc 호출을하는 법을 배웁니다. 또한 실행될 때 코드를 추적하기 위해'console.log'를 사용하는 것을 고려하십시오. 'forEach'를 수행하는 동안 배열'numbers'를 변경하기 때문에 문제가 있는지 묻습니다. 그리고 DOM 엘레멘트'onclick' 애트리뷰트 안에서'forEach'를하는 것이 최선의 방법은 아닙니다. 'onclick' 함수를 호출하고 그 함수에서'forEach'를합니다. – Intervalia

+0

@Intervalia 인터벌 시간에 문제가있어서 'setTimeout'또는 'setInterval'대신 'sleep()'테스트를 사용했습니다. – Jamin

+0

@Jamin 나는 내 대답에 실수를했다. 새로운 업데이트 된 내용을 읽어보십시오. 죄송합니다! –

답변

4

끔찍한 sleep 기능 외에도. myFunctionforEach의 콜백으로 사용하고 myFunctionnumbers (이는 forEach이라고하는 동일한 배열 임)으로 새 요소를 푸시합니다.

forEach은 여전히 ​​배열을 반복하면서 새로 푸시 된 항목에 대한 콜백을 호출하지 않습니다. 그러나 루프가 끝날 때까지 배열의 항목이 두 배가됩니다. MDN에 따른 같이

forEach() 처리 요소의 범위 callback의 제 호출하기 전에 설정된다. forEach() 호출이 시작된 후 배열에 추가 된 요소는 callback에 의해 방문되지 않습니다. 클릭이 발생 다음

배열 N 요소가 포함되어있는 경우

, N 요소가 표시되며, myFunctionN 다른 요소를 밀어되며, 다음 클릭이 2N 요소 일어날 때,이 시간이 표시됩니다 ...

클릭 할 때마다 배열의 요소가 두 배가됩니다.