2014-12-10 2 views
1

로드시 자체 화재가 발생하고 시스템이 기록한 모든 경고를 얻기 위해 재귀 적으로 30 초마다 호출하는 IIFE가 있습니다.jQuery IIFE, 요청시 삽입 하시겠습니까?

잘 작동합니다.

(function GetAlerts() { 
    setTimeout(function() { 
    $.ajax({ url: "?DO=getalertcount", success: function(data) { 
     //do DOM stuff with data    
    }, complete: GetAlerts }); 
    }, 30000); 
})(); 

알림 대기열에 쓰는 위젯을 중지하는 등의 작업을 수행합니다. 따라서 즉시 경고창이 나타나야합니다. 30 초 동안 기다리지 말고 발사하십시오.

(예 : 위젯의 클릭 이벤트를 중지로)

그래서, 나는 행동의 핸들러에서 어떤 방식으로 필요에 따라이 GetAlerts()를 호출 할 (소켓과 롱 폴링으로 인해 서버 제약 옵션 없음) 적절한 방법 주문형 전화에 무엇

이 때문에 30 초 루프가 유지됩니다 (또는 온 디맨드 끼어 후 다시 시작하여)

  1. 여러 개의와 끝까지하지 않는 것이 setTimeout 루프 실행
  2. 코드 톤을 복제하지 않습니다. (성공한 부분에서 발생하는 DOM 요소가 많아서)

이름으로 함수를 호출하고 시간 초과 전역 변수로 변경하고 제한 시간을 멈추게되면 위의 사항 중 하나라도 실패하거나 전혀 호출하지 못했습니다.

+1

우리는 보통 클로저가 아니라 IENFE라고 명명 된 함수 표현식을 즉시 호출합니다. – Bergi

+0

@Bergi에게 감사드립니다. 저는 그것에 대한 약간의 연구를했고, 제가 가진 것을 더 잘 묘사한다고 생각하는'IIFE'를 보았습니다. 그러나 그것은 여전히 ​​그 '시간 초과'안에 들어가는 더 좋은 대답으로 나를 인도하지는 못했다. – briansol

+1

Ajax 요청이 현재 실행 중일 때 경고를 "요구"하면 어떻게 될까요? – Bergi

답변

1

setTimeoutsuccess 처리기로 이동하고 clearTimeout 단일 루프 실행을 유지하십시오. 공공 .poll 방법

클래스는 도움이 될 수 있습니다 :

function AlertManager() { 
    var successCallback = function (data) { 
     // Private ajax success handler 
     //do DOM stuff with data 
     $('#responses').append('Polled!<br/>'); 
    }, 
    _poll = function() { 
     $.ajax({ 
      url: "/echo/json/", 
      success: successCallback, 
      complete: function() { 
       timeoutId = setTimeout(_poll, timeoutMs); 
      } 
     }); 
    }, 
    timeoutId, 
    timeoutMs = 5000; 

    this.poll = function() { 
     clearTimeout(timeoutId); 
     _poll(); 
    }; 
} 

가 바이올린 데모에서 살펴 보자 : http://jsfiddle.net/neustroev_ai/64on18zg/

희망이 도움이!

+0

화려한 솔루션. :) – briansol

관련 문제