long-poll jQuery.ajax()는 전화가 잠든 후 다시 전화하지 못합니까?
제 웹 앱은 서버의 최신 데이터를 최신으로 유지하기 위해 '롱 폴(long poll)' 방식을 사용합니다.서버는 몇 분 차이가 날 수 있는 새로운 데이터가 있을 때만 응답합니다. (실온이 바뀌거나 누군가 설정을 변경했을 때만 업데이트를 볼 수 있는 난방 제어 시스템입니다.
var version = "0";
function updater() {
$.ajax({
type: "POST",
url: "/listen",
data: version,
success: function (data) {
version = handleUpdates(data);
updater();
},
error: function () {
setTimeout(updater, 1000);
}
});
}
데스크톱 브라우저와 전화기에서 한 가지 경우를 제외하고는 잘 작동합니다.Chrome이 탑재된 안드로이드폰에서는 약 10분 이상 휴대폰이 잠이 든 후 이상한 현상이 발생한다는 것을 발견했습니다.포스트 신청이 취하된 것 같은데, 핸드폰이 잠들어 있어서 그럴 만도 하다고 생각합니다.Chrome debugger의 Network(네트워크) 탭에서 POST 요청의 Status Text(상태 텍스트)에 (취소)라고 표시됩니다.
문제는 요청이 취소된 상태에서 전화기를 깨우면 성공() 또는 오류() 기능이 호출되지 않고 웹 앱이 업데이트되지 않는다는 것입니다.$.ajax()가 저에게 다시 전화하기로 한 약속을 어겼습니다.
문제는 일부 장치에서만 발생합니다.저는 친구들에게서 기기를 빌려 임시 테스트를 몇 번 할 수 있었습니다.지금까지 안드로이드폰에서만 문제를 보았습니다.그러나 전화기가 충전기에 연결되어 있는 것은 아닙니다.태블릿이나 애플 기기나 윈도우 PC에서는 본 적이 없습니다.
ajax 설정에 시간 초과를 추가하려고 했습니다.
timeout: 120 * 1000,
이렇게 하면 오류() 함수가 웨이크업 후 최대 2분 후에 호출되기 때문에 도움이 됩니다.하지만 사용자가 1~2초 안에 업데이트를 볼 수 있기를 바랍니다.불필요한 서버 트래픽이 발생하기 때문에 타임아웃을 그렇게 짧게 하고 싶지 않습니다.
또한 컴퓨터가 절전 모드에서 다시 시작될 때를 찾을 수 있습니까?에서 설명한 대로 1초 세트Interval에서 지연 시간을 찾아 장치가 절전 모드인지 여부를 감지하려고 시도했습니다.웨이크업이 감지되면 게시물을 중단()하고 다른 게시물을 시작합니다.이는 대부분의 경우에 도움이 됩니다.하지만 그것은 신뢰할 수 없는 것으로 드러났습니다.가끔 수면 중에 시간 이벤트가 정상적으로 계속 진행되는 것처럼 보이고 포스트 요청은 어쨌든 취소됩니다.그리고 그것은 믿을만한 해결책처럼 느껴지지 않습니다.
저는 jQuery: (2.1.2) 최신 버전과 Chrome (47)을 사용하고 있습니다.
이게 잘 될지 안 될지 잘 모르겠어요, 지금은 테스트할 수 없지만 한번 해보세요.
$(window).focus(function() {
updater();
});
저는 예전에 전화가 잘 때 자바스크립트 통화가 중단되는 문제가 있었습니다.결국 제가 해결할 수 있었던 것은window.setInterval()정지하는 것처럼 보이지만 전화기가 깨면 다시 살아납니다
그래서 자주 통화를 취소하고 다시 시작하는 간격을 설정하는 것을 추천합니다.이것은 전화 수면을 통해 생존하는데 도움을 줄 수 있습니다.
대략 다음과 같습니다.
var myCall = $.ajax({...});
Window.setInterval (refreshCall(), 10000);
function refreshCall (){
myCall.abort ();
myCall = $.ajax({...});
}
다음과 같은 고급 감시 기능은 어떻습니까?
var restartTimer = null;
function updater(){
$.ajax({
type: "POST",
url: "/listen",
data: version,
success: function (data) {
version = handleUpdates(data);
clearTimeout(restartTimer);
updater();
},
error: function () {
clearTimeout(restartTimer);
setTimeout(updater, 1000);
}
});
}
// Kick it when the phone wakes up.
$(window).focus(function(){
restartTimer = setTimeout(function(){
initializeAll();
}, 6000);
updater();
});
당신은 $($) 창을 알고 있습니다.전화기가 깨면 포커스가 발생하므로 Almis가 제안하는 대로 업데이트 프로그램()을 시도하지만 페일 세이프 타이머를 사용합니다.(노트북이나 iOS에서) 업데이터가 발생하면 타이머가 취소되어 모두 정상이지만 업데이터가 작동하지 않으면 6초 후 fail-safe 타이머가 발생하고 initializeAll()을 호출하여 전체 앱을 재부팅합니다.
A는 어떻습니까?setInterval, 호출된 시간을 저장한 다음 마지막으로 호출된 시간을 현재 시간과 비교합니다. 간격이 10초이고 마지막 실행 후 5분이 지난 시간이라면 방금 잠에서 깼다고 가정할 수 있습니까?그런 다음 현재의 ajax 호출을 중단하고 다시 시작합니다.
가장 좋은 대답은 "그러지 마세요" 입니다.서버가 서버 측에서 변경사항을 추적하는 동안 응답 대기 중입니다.서버가 응답하도록 하고 jQuery ping을 주기적으로 하면 됩니다.상태 변경이 없을 때 실제로 새로 고침을 방지하려면 마지막으로 변경되었거나 변경된 내용을 포함할 수 있지만, 서버가 동일한 작업을 수행하는 경우에는 응답하게 하고 다음 폴링을 기다립니다.
setInterval(function () {
$.post({"/listen", version, function (data) {
if(data.haschanged)
version = handleUpdates(data);
}).fail(function () {
// any error correction on failed call
});
}, 1000);
언급URL : https://stackoverflow.com/questions/34340878/long-poll-jquery-ajax-fails-to-callback-after-phone-sleeps
'programing' 카테고리의 다른 글
| 우커머스 서브스크립션에서 다음 결제일을 설정하는 방법은? (0) | 2023.09.26 |
|---|---|
| A2부터 무한대까지 지정(NO VBA) (0) | 2023.09.26 |
| 브라우저에서 실행되는 자바스크립트 샌드박스가 가능합니까? (0) | 2023.09.26 |
| AngularJS에서 $timeout을 사용하여 매개 변수로 함수를 실행하는 방법은? (0) | 2023.09.26 |
| 자바스크립트를 이용하여 다음 / 이전 요소를 얻으시겠습니까? (0) | 2023.09.26 |