2015-01-05 2 views
1

나는 postMessage가 Google 크롬의 nextTick 구현이라고 들었습니다. PostMessage가 웹 작업자 들간의 의사 소통에 사용되었다고 생각하기 때문에이 문장에 대해 다소 혼란 스럽습니다.postMessage를 nextTick 또는 setTimeout (__, 0) 대신 사용할 수있는 방법은 무엇입니까?

나는 postMessage(function() {return;});과 같은 표현식을 사용했지만 이벤트 루프가 유휴 상태 일 때 실행할 함수를 예약하는 대신 오류 만 발생했습니다. postMessage는 예상대로 메시지 만 가져 오는 것 같습니다.

이벤트 루프가 유휴 상태 일 때 함수 호출을 예약하는 방법으로 postMessage를 사용할 수 있습니까?

+0

[인용 필요] – Nit

+1

자신에게 메시지를 게시하여 'postMessage'를 사용하여 더 빠른'setTimeout (fn, 0)'을 생성하는 오래된 해킹이 있습니다. 타이머 대기열의 오버 헤드없이 비동기 적으로 전달됩니다. 더 이상 사용되지 않으며 일반적으로'MutationObserver' 해킹이 대신 사용됩니다. –

+1

여기 - 일부 독서물 : http://dbaron.org/log/20100309-faster-timeouts –

답변

3

Google 크롬은 사실 마이크로 태스크 대기열이라는 개념이있는 V8에서 실행됩니다. postMessage 부분은 DOM API의 일부이며 노드에서 nextTick이 수행하는 것과 유사한 마이크로 태스크를 예약합니다 (크롬 루프주기가 노드와 매우 다르지만).

이렇게 보이는 setTimeout(fn, 0) 시뮬레이션 PostMessage를 사용하는 오래된 해킹 있습니다 :

var queue = []; 
window.addEventListener("message", function(e){ 
    if((e.source !== window) || (e.data === "flush")) return; // not the right message 
    queue.forEach(function(fn){ fn(); }); // call all functions; 
    queue = []; // clean the queue; 
}); 

function nextTick(fn){ 
    queue.push(fn); // add the function 
    window.postMessage(fn, "flush", "*"); 
} 

이 있습니다 영리한 트릭 대신 직접 윈도우의 MessageChannel을 사용하지만 모두 같은 생각입니다.

이 기술의 이전 언급은 in this blog post입니다. 돌연변이 옵저버를 사용하는 더 빠른 setTimeout에 대한 더 빠른 해킹이 있기 때문에 거의 사용하지 않습니다.

다른 기술에 대해서는 a relatively modern source입니다.

관련 문제