2017-05-24 2 views
0

이 유성 코드는 n 초마다 한 번씩 문서를 인쇄해야합니다. 어떻게 작동합니까? 들으 커서를 시간 간격으로 누르십시오

 myCol.find({abc: undefined}).forEach(
     function (doc) { 
      setTimeout(function (doc) { 
       console.log(JSON.stringify(doc)); 
      }, 1000) 
     } 
    ) 

이 문제

다음 문서가 정의되지 타이머가 이렇게 그냥 한 번에 발사, 활성화되지 않습니다.

+0

정교한 것이다 "는 문서는 정의되지 않습니다 "find 메소드 문서 또는 for each를 통해이를 해결해야한다. API 용어에서 find 또는 forEach가하는 일에 대해서는 잘 모릅니다. 그러나 시간 초과에 대해서는 여기에 있습니다. JS에서 비동기 이벤트가 어떻게 작동하는지 알고 있습니까? 그들은 스택에 추가되기 때문에 한 번씩 실행됩니다. 모두 약 1000ms입니다. 그렇습니다. 코드 실행이 끝난 후 1000ms를 기다리기 때문에, 서로 1000ms를 기다리지 않고 즉시 하나씩 실행합니다. 첫 번째 발생시에만 타이머 기능을 설정하고 그 안에는 후속 타이머를 설정해야합니다. – user907860

+0

타이머 문제 솔루션과 관련하여 코드에서 예제를 제공 할 수 있습니까? –

답변

1

예를 들어 JS의 이벤트 모델에 대한 필수적인 이해는 필요하지 않습니다. JS는 단일 스레드 언어이며 setTimeout, setInterval, requestAnimationFrame을 통해 assync 함수를 추가 할 때이를 스택에 추가합니다. 조건이 충족되면 엔진은 현재 스레드가 완료된 후 함수를 하나씩 실행합니다.

예를 들어, forEach 함수에서 모든 요소에 대해 호출되는 annon 함수를 추가하고 있습니다.

따라서 컬렉션은 단일 스레드에서 을 통과합니다. 이 스레드에서 annon 함수는 시간 초과 함수를 추가하지만 immediatelly 호출되지는 않습니다. 스택에 추가됩니다. 그리고이 스택의 함수는 현재 스레드 (이 경우 컬렉션을 통한 순회)가 끝날 때까지 호출되지 않습니다.

현재 스레드가 완료된 후 JS 엔진은 스택에서 함수를 가져 와서 현재 함수의 조건이 충족되는지 (스택에 추가 된 시점으로부터 1000ms와 같은지) 확인합니다. 추가 된 모든 시간 초과 콜백에 대해 조건이 충족되었으므로 (첫 번째 콜백에 통과 한 경우 1000ms, 그 다음 콜백에 대해서는 반드시 통과해야 함) 그들은 한 번에 하나씩 해고 당하고 있습니다.

의 예는 다음과 같습니다

var i = 0; 
function traverseInLoop() { 
    console.log(JSON.stringify(myCol[i])); 
    if (myCol(++i) { 
    setTimeout(traverseInLoop, 1000) 
    } 
} 
setTimeout(traverseInLoop, 1000); 

또는 그런 일을, 당신은 생각을해야하지만, 다음 말하지 않는 경우에, 나는

관련 문제