programing

long-poll jQuery.ajax()는 전화가 잠든 후 다시 전화하지 못합니까?

easyjava 2023. 9. 26. 22:40
반응형

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

반응형