2009-12-08 7 views

답변

1

네, 서버에 대한 두 번째 연결을 사용하십시오. 이것이 iirc의 Bayeux protocol을 포함하여 대부분의 프레임 워크가하는 것입니다. 실제로 두 번째 연결이 필요하다는 것을 알게되면 걱정할 필요가 없습니다. Moishe가 큐에 대해 얘기했다 무엇

var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase(); 
var startLongpoll = function() { 
    $.ajax({ 
     type:"POST", async:true, cache:false, timeout:0, 
     data: {userid: userid}, 
     success: function(data){ 
      _outCallback(data); 
      setTimeout(startLongpoll, 10); 
     }, 
     error: function(xhr, textStatus, errorThrown){ 
      _errCallback(textStatus+" ("+errorThrown+")"); 
      setTimeout(startLongpoll, 5000); 
     }, 
    }); 
}; 
setTimeout(startLongpoll,10); 

은 JS는 당신이 그들을 파견 것을 XHR이이 순서대로 수신을 보장하지 않는다는 것입니다 : 여기

은 위에서 내 링크에서 수정 약간 긴 폴링 코드입니다 . 메시지는 손실되지 않습니다 (또는 적어도 테스트에 포함되지 않았습니다). 이것은 긴 폴링 문제는 아니지만 xhr을 사용하여 보낼 때 고려해야 할 사항입니다.

var queue = []; 
var busy = false; 
this.send = function(msg) { 
    queue[queue.length] = msg; 
    if (busy) return; 
    busy=true; 
    var s = function() { 
     var m = queue.shift(); 
     $.ajax({ 
      type:"POST", async:true, cache:false, timeout: 5000, 
      data: {userid:userid, msg:m}, 
      error: function(xhr, textStatus, errorThrown){ 
       _errCallback(textStatus + " (" + errorThrown + ")"); 
       if (queue.length>0) s(); else busy = false; 
      }, 
      success: function(){ 
       if (queue.length>0) s(); else busy = false; 
      } 
     }); 
    } 
    s(); 
}; 

두 가지주의 할 :

그래서 여기 큐 코드입니다. 첫째, 많은 메시지를 보내고 대기열이 가득 차면 지연이 약간 있습니다. 한 번에 하나씩 전체 큐를 보내는 방법을 찾는 것이 좋습니다. 이를 수행하는 한 가지 방법은 메시지를 JSON 배열로 변환하고 서버에서 디코딩하는 것입니다.

둘째, 메시지를 보내는 중에 오류가 발생하면 메시지가 손실됩니다. 실패한 메시지를 대기열로 밀어 넣거나 성공할 때까지 제거하지 않는 코드가 필요합니다.

1

이 그냥 POST를 할 XHR을 사용에서 내가 사용 예제 코드입니다.

한 가지 문제는 일부 브라우저에서 서버 당 2 (또는 일부 숫자 n) 개의 동시 XHR 연결 만 가질 수 있다는 것입니다. 이 문제를 해결하려면 현재 XHR이 완료 될 때 대기중인 모든 메시지를 게시 한 다음 해당 게시물이 완료 될 때까지 새 큐를 채울 수있는 큐를 만들어야합니다.

+0

긴 폴링은 10 초 이상 걸릴 수 있습니다. 서버로 보낼 때까지 기다릴 시간이 오래 걸립니다. 몇 가지 인기있는 프레임 워크가 이미 이것을 해결했다고 가정합니다 - 그러나 어떻게? (오른쪽, 탭 당 서버 당 2 개의 연결. 하나는 설문 조사이므로 두 번째 것은 서버 xhr, 이미지, 스타일 시트 등입니다. –

+0

비동기 XHR이 필요합니다. 그런 다음 완료하기를 기다리는 동안 서버에 데이터를 게시하는 또 다른 (비동기식 또는 비 호환 형, XHR) XHR을 만들 수 있습니다. 두 번째 XHR *이 * async이면 두 번째 XHR이 진행되는 동안 게시하려는 메시지를 잃지 않도록 대기열을 구현해야합니다. –

+0

2 연결 제한을 초과하여 asynch xhr을 보내면 메시지를 잃어 버리지 않는다고 생각합니다. 서버에서 대기 중이라는 것을 의미합니까? –

1

서버에 데이터를 보내는 것은 단지 표준 요청 일뿐입니다. Xhr은 괜찮습니다, JSONP, 무엇이든지 보트를 뜨게합니다.

롱 폴링으로 혼동하지 마십시오. 긴 폴링은 서버에서 클라이언트로 보내는 방법으로 만 존재합니다. 클라이언트에서 서버로 데이터를 보내는 것은 웹이 시작된 이래로 무엇을했는지, 그리고 일반적인 Xhr 요청 만 있으면됩니다.