답변
네, 서버에 대한 두 번째 연결을 사용하십시오. 이것이 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 배열로 변환하고 서버에서 디코딩하는 것입니다.
둘째, 메시지를 보내는 중에 오류가 발생하면 메시지가 손실됩니다. 실패한 메시지를 대기열로 밀어 넣거나 성공할 때까지 제거하지 않는 코드가 필요합니다.
이 그냥 POST를 할 XHR을 사용에서 내가 사용 예제 코드입니다.
한 가지 문제는 일부 브라우저에서 서버 당 2 (또는 일부 숫자 n) 개의 동시 XHR 연결 만 가질 수 있다는 것입니다. 이 문제를 해결하려면 현재 XHR이 완료 될 때 대기중인 모든 메시지를 게시 한 다음 해당 게시물이 완료 될 때까지 새 큐를 채울 수있는 큐를 만들어야합니다.
긴 폴링은 10 초 이상 걸릴 수 있습니다. 서버로 보낼 때까지 기다릴 시간이 오래 걸립니다. 몇 가지 인기있는 프레임 워크가 이미 이것을 해결했다고 가정합니다 - 그러나 어떻게? (오른쪽, 탭 당 서버 당 2 개의 연결. 하나는 설문 조사이므로 두 번째 것은 서버 xhr, 이미지, 스타일 시트 등입니다. –
비동기 XHR이 필요합니다. 그런 다음 완료하기를 기다리는 동안 서버에 데이터를 게시하는 또 다른 (비동기식 또는 비 호환 형, XHR) XHR을 만들 수 있습니다. 두 번째 XHR *이 * async이면 두 번째 XHR이 진행되는 동안 게시하려는 메시지를 잃지 않도록 대기열을 구현해야합니다. –
2 연결 제한을 초과하여 asynch xhr을 보내면 메시지를 잃어 버리지 않는다고 생각합니다. 서버에서 대기 중이라는 것을 의미합니까? –
서버에 데이터를 보내는 것은 단지 표준 요청 일뿐입니다. Xhr은 괜찮습니다, JSONP, 무엇이든지 보트를 뜨게합니다.
롱 폴링으로 혼동하지 마십시오. 긴 폴링은 서버에서 클라이언트로 보내는 방법으로 만 존재합니다. 클라이언트에서 서버로 데이터를 보내는 것은 웹이 시작된 이래로 무엇을했는지, 그리고 일반적인 Xhr 요청 만 있으면됩니다.
다른 질문에 답변하지 않습니까? –
아니요 - 거기에 대한 답변은 긴 폴링 동안 서버에 데이터를 보내는 방법이 아닌 긴 폴링을 수행하는 방법을 보여줍니다. 내가 놓친 게 아니라면? –