2016-08-03 2 views
11

대 나는 다음과 같은 코드에서 관찰 한 : 아무리 내가 이것을 실행 횟수약속의 setTimeout

setTimeout(function(){console.log('setTimeout')}); 
Promise.resolve(1).then(function(){console.log('promise resolve')}) 

, 약속 콜백 항상에서는 setTimeout 전에 기록합니다.

내 이해는 두 콜백 모두 다음 틱으로 실행되도록 예약되어 있으며, 약속이 항상 타임 아웃보다 우선시되는 것을 실제로 이해하지 못합니다.

+3

'약속'은 생성 된 즉시 '해결'됩니다. 반면에 'setTimeout'은 나중에 대기열에 있습니다. – Rayon

+1

내부 대기열/이벤트 루프에서 읽습니다. https://developer.mozilla.org/en -US/docs/Web/JavaScript/EventLoop, http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/ 또는 https://www.youtube.com을 시청하세요./watch? v = 8aGhZQkoFbQ –

답변

4

짧은 답변 약속 루프는 setTimeout 콜백 함수보다 우선 순위가 높습니다 (또는 이해 방법).

긴 답변이 비디오를 시청하십시오. 매우 도움이됩니다. 희망이 도움이됩니다.

https://www.youtube.com/watch?v=8aGhZQkoFbQ

+0

좋은 비디오 :) thanks –

0

제한 시간 초과 및 약속은 다른 용도로 사용됩니다.

setTimeout은 특정 시간 간격으로 코드 블록의 실행을 지연시킵니다. 약속은 비동기 코드 실행을 허용하는 인터페이스입니다.

약속을 사용하면 다른 작업이 완료 될 때까지 기다리는 동안 코드를 계속 실행할 수 있습니다. 일반적으로 이것은 네트워크 호출입니다. 따라서 귀하의 then() 통화의 모든 내용은 네트워크 통화 (또는 약속이 기다리고있는 모든 것)가 완료되면 실행됩니다. 약속의 시작과 약속의 결의 사이의 시간차는 전적으로 약속이 실행되는 것에 달려 있으며 모든 실행마다 바뀔 수 있습니다.

시간 제한 전에 약속이 실행되는 이유는 약속이 실제로 아무것도 기다리지 않아서 즉시 해결된다는 것입니다.

+2

이 논리에 따르면, 다음과 같은 코드가 있습니다 :'Promise.resolve (2) .then (function() {console.log ('promise resolve 2')}); console.log ('Immediate')' "immediate resolve"전에 promise resolve 2가 기록됩니까? 하지만 그것은 – frankies

+3

@frankies가 아닙니다. 약속이 대기 및 해결되는 방식과 관련이 있습니다. 내 대답은'setTimeout'과'Promise'의 차이점입니다. – jfadich

9

setTimeout()하면 코드의 지연 시간 제한이 여전히 최소 4ms의에서 지연됩니다를 지정하지 않은 너무도 불구하고 minimum delay of 4ms 있습니다. 그 동안 귀하의 약속은 .then()입니다.

+0

4ms 스로틀 최적화가 없더라도 어쨌든 약속은 더 빨라질 것입니다. 왜냐하면'setTimeout'은 task를 생성하고'Promise'는 microtask (job)을 생성하기 때문입니다. 그게 진짜 이유 야. – Artin

+1

음 ... 그래,하지만 실제로 4ms 최소 *는 매크로 대 마이크로 작업 priory가 들어 가지 않는 질문에 적용됩니다. 실제 구현 된 동작과 다른 동작을 상상할 경우 약속 시간이 제한 시간보다 우선 순위가 낮더라도이 예제의 약속은 최소 4ms의 시간 초과로 인해 계속 기록됩니다. 그렇지만 현실 세계로 되돌아 가면 JS에 마이크로 작업 컨셉이 존재한다는 것을 아는 것이 유용하다는 점을 언급 해 주셔서 감사합니다. – nnnnnn

5

Promise.resolve는 마이크로 태스크를 예약하고 setTimeout은 매크로 태스크를 예약합니다. 그리고 마이크로 태스크는 다음 매크로 태스크를 실행하기 전에 실행됩니다.

+2

가장 가까운 대답입니다.나는 작업/마이크로 태스크의 깊은 설명에 대한 링크를 추가 할 것이다. https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ – Artin

+1

마이크로 타스크의 출처는 MutationObserver와 Promises라는 두 가지 일뿐입니다. – Artin