2014-12-25 4 views
20

NodeJS 0.11은 물론 io.js와 Node 0.12 브랜치가 모두 기본 약속과 함께 제공됩니다.Promise.resolve(). then vs setImmediate vs nextTick

미래의 이벤트 루프 사이클에서 항상 실행되는 고유 약속 have a .then method.

지금까지 내가 이벤트 루프의 다음 반복에 일을 큐에 setImmediate을 사용하고 지금까지 나는에게 이후 switched from nextTick :

Promise.resolve().then(deferThisToNextTick); 
:

setImmediate(deferThisToNextTick); // My NodeJS 0.10 code 
process.nextTick(deferThisToNextTick); // My NodeJS 0.8 code 

우리는 지금이 작업을 수행 할 수있는 새로운 방법을 가지고 있기 때문에

어떤 것을 사용해야합니까? 또한 - Promise.resolve.then입니다. 이벤트 루프 전후에 실행되는 코드는 setImmediate 또는 nextTick과 비슷합니까?

+0

일부 연구 공유 : Chromium - 약속은 마이크로 태스크를 대기열에 넣습니다. 여기에서 마이크로 태스크 실행 https://github.com/yoavweiss/Blink/blob/80ec93f1d58a0a0ce99a07ed07c203a106b2a88c/Source/core/dom/Microtask.cpp 스크립트 도착시 여기로 전화 함 또는 확인하고 스크립트가 실행되고 있지 않습니다. https://github.com/yoavweiss/Blink/blob/5be896b969d644c18faccb07f43ae086/Source/core/html/parser/HTMLScriptRunner.cpp –

+0

약속의 해결책 https://github.com/joyent/node/blob/857975d5e7e0d7bf38577db0478d9e5ede79922e/deps/v8/src/promise.js#L154 - 전화 https://github.com/joyent/node/blob/857975d5e7e0d7bf38577db0478d9e5ede79922e/deps /v8/src/execution.cc#L321 - 도착 https://github.com/joyent/node/blob/857975d5e7e0d7bf38577db0478d9e5ede79922e/deps/v8/src/execution.cc#L310 –

+2

매우 관련 : https : // github. com/joyent/node/issues/7714 –

답변

19

Promise.resolve().then을 사용하면 nextTick보다 이점이 없습니다. 동일한 큐에서 실행되지만 우선 순위가 약간 높습니다. 약속 처리기는 다음 틱 콜백이 실행되는 것을 막을 수 있지만 그 반대는 불가능합니다. 이 동작은 구현 세부 사항이므로 의존해서는 안됩니다.

Promise.resolve().then은 분명히 느리게 발생합니다 (많이 생각합니다). 왜냐하면 두 가지 약속이 만들어지기 때문입니다.

현재 광범위한 구현 정보를 찾을 수 있습니다 https://github.com/joyent/node/pull/8325

가장 중요한 부분 : Promise.resolve().thennextTick 같이하고 setImmediate을 좋아하지. setImmediate의 n 위치를 사용하면 코드 동작을 크게 바꿀 수 있습니다.

나는 교칙에 대한 굵게 표시된 부분에 대답하지 않을거야
+0

Upvoted. 마지막 단락의 예를보고 싶습니다. – thefourtheye

+0

감사합니다.이 코드는 정확하고 내가 코드에서 관찰 한 것입니다. 당신이 언제 사용하는지, 그리고 그것이 왜 이렇게 작동 하는지를 정교 할 수 있다면 좋을 것입니다. @thefourtheye'setImmediate' 대신'nextTick'이 작동하지 않는 예 -'Promise.resolve(). then' –

+0

내 말은'Promise.resolve(). then '을 사용하면 안된다는 것입니다. . 이 트릭은 아무 것도 달성하지 못합니다. nextTick 대 setImmediate와 관련하여 많은 정보가 있습니다 – vkurchatkin

6

,하지만 문제

사용해야합니까?

Promise.resolve().then()을 사용하는 이유는 비동기 적으로 실행 된 함수의 결과에 대한 약속에 관심이 없다면 생각하지 않습니다. 물론 인 경우 콜백 지옥을 다루거나 을 setTimeout 또는 nextTick으로 만드는 것보다 훨씬 월등합니다.

두 번째로 기술적 인 차이점이 있습니다. 타이밍보다 더 많은 수입이 있습니다. 약속은 예외를 삼키지 않습니다. 아마 당신은 원하지 않을 것입니다. 따라서, 언급 된 @vkurchatkin처럼, 버리기위한 약속 만 세우지 마십시오. 속도가 느릴뿐만 아니라 코드가 읽기 쉽고 앱이 오류를 발생시키기 쉽기 때문에 더욱 그렇습니다.

-2

Promise.resolve는 즉시 (동기식으로) 해결되는 반면 setImmediate는 현재 이벤트 실행 후 곧바로 해결됩니다.

+1

브라우저 콘솔에서 다음과 같이 잘못 입력했는지 확인하십시오 :'Promise.resolve ([]). then (function() {console.log ('1');}); console.log ('2'); –