2012-01-17 3 views
4

다음 코드는 Essential JavaScript Design Patterns For Beginners입니다. 여기에 setTimeout 함수가 사용 된 이유는 무엇입니까?여기에 setTimeout 함수가 사용 된 이유는 무엇입니까?

var pubsub = {}; 
(function(q) { 

    var topics = {}, 
     subUid = -1; 

    q.publish = function(topic, args) { 

     if (!topics[topic]) { 
      return false; 
     } 

     setTimeout(function() { 
      var subscribers = topics[topic], 
       len = subscribers ? subscribers.length : 0; 

      while (len--) { 
       subscribers[len].func(topic, args); 
      } 
     }, 0); 

     return true; 

    }; 

    q.subscribe = function(topic, func) { 

     if (!topics[topic]) { 
      topics[topic] = []; 
     } 

     var token = (++subUid).toString(); 
     topics[topic].push({ 
      token: token, 
      func: func 
     }); 
     return token; 
    }; 

    q.unsubscribe = function(token) { 
     for (var m in topics) { 
      if (topics[m]) { 
       for (var i = 0, j = topics[m].length; i < j; i++) { 
        if (topics[m][i].token === token) { 
         topics[m].splice(i, 1); 
         return token; 
        } 
       } 
      } 
     } 
     return false; 
    }; 
}(pubsub)); 
+1

관련 질문 http://stackoverflow.com/questions/5113840/using-settimeout-to-improve-responsiveness – Ben

답변

2

publish 함수는 어떤 방식으로 스케줄링 주어진 코드 블록에서 즉시 반환이 방법이 바로 후에 비동기 적으로 실행된다.

많은 청취자에게 통지하는 것처럼 보이므로 저자는 나중에 publish 코드를 차단하지 않고 알림 루프를 실행하려고했습니다. 또한 알림 코드 (있는 경우)가 클라이언트 코드에 필요하지 않음을 유의하십시오.

부작용은 구독자 중 하나가 예외를 throw하면 publish 메서드가 영향을받지 않습니다 (다른 호출 스택).

어쩌면 관용적이지는 않지만 JavaScript에서는 꽤 일반적인 패턴입니다. 때로는 다른 이벤트/타임 아웃을 실행할 때도 사용됩니다. 특히 매우 장기간 실행되는 경우에는 특히 그렇습니다.

+0

감사. 그렇다면 setTimeout에 제공된 함수가 다른 스레드에서 실행됩니까? – Ben

+0

@Ben : ECMAscript에 스레드가 없습니다 (웹 워커에 대해 잊어 버림). 이것은 나중에이 작업이 "UI 대기열"에 추가된다는 것을 의미합니다. Javascript 코드가 브라우저에서 UI를 업데이트하는 동일한 스레드에서 실행되면 모든 작업이 큰 메시지 루프에 대기합니다. 협업 멀티 태스킹의 원칙. – jAndy

+0

글쎄, JavaScript에는 3 가지 *가 없습니다. 오히려 단일 작업자 스레드에서 하나씩 실행되는 이벤트 대기열에 대해 생각해보십시오. 'publish'가 돌아 오면 즉시 다른 이벤트를 처리하는 데 사용되는 작업자 스레드를 해제합니다. 그것은 0을 가진'setTimeout' 일 수도 있습니다. 그것은 오랫동안 기다리고 있던 다른 이벤트 일 수도 있습니다. [이 질문] (http://stackoverflow.com/questions/7266918)을 참조하십시오. –

관련 문제