2016-10-18 7 views
0

私は数秒ごとにサーバーをポーリングしてDOMを更新するJavascriptの短いスニペットを持っています。setIntervalはAndroidのFirefoxで継続的に実行されます

function updateCard() {  
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      card = JSON.parse(this.responseText); 
      document.getElementById("season").innerHTML = card.season; 
     }     
    };      
    xhttp.open("GET", "/curr_card/", true); 
    xhttp.send(); 
} 
window.onload = updateCard; 
window.setInterval(updateCard,2000); 

ほとんどのブラウザではどうなりますか。 updateCardへの一回限りの通話がありますが、サーバー全体でクライアントあたり1秒あたり〜1/2接続が表示されます。

しかし、Android(49.0)でFirefoxのページにアクセスすると、ブラウザは連続してポーリングを開始します/curr_card/、数十秒。

setInterval行をwindow.setInterval(function() {updateCard();},2000);に置き換えることをおすすめしていますが、これは役に立ちません。

私はJavascriptとAJAXの新機能です。なぜこれが起こっているのか分かりません。それはFFのバグですか?私は要求されればより多くのコードを掲載することができます

ありがとうございます。

+1

私はバグについて知りません。 '' 'window.setTimeout()' ''を使ってみましたか?それがうまくいけば、 '' 'updateCard()' 'の最後にタイマーを設定するだけで、それは再び自分自身を呼び出すことになります... – Dario

+2

@Darioに落ち着くのは良い考えですが、おそらく正確に2秒(それが重要である場合)ではありません。 Gyppo、ちょうどちょうどちょっと後に、最初から数十秒間連続して投票しますか?また、AndroidでChromeでこれが起こらないと想定するのは安全ですか? – Zach

+0

再帰的なsetTimeoutを置くことはできません。なぜなら、関数は他の場所からも呼び出されるからです。しかし、私は再帰的なラッパーを作った: 'function continuousUpdate(){updateCard(); window.setTimeout(continuousUpdate、2000); } window.onload = continuousUpdate; ' これは同じ問題を抱えています。 AndroidのChromeでこの問題は表示されません。 – Samizdis

答えて

1

OPのコメントでテストして議論したところ、OPのHTC M7でのFirefox固有の問題であると判断しました.Gallaxy S7の同じバージョンのFirefoxで再現できないためです。

0

これは、一部のデバイスでFirefoxで発生する可能性があります。

応答があるため、サーバ後半の答えを完了していないが、それはように別のリクエストを送信したときにはこのように何かの操作を行うために...

が起こることがあります。

function updateCard(before, after) {  
    if(before) { 
     before(); 
    } 

    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      card = JSON.parse(this.responseText); 
      document.getElementById("season").innerHTML = card.season; 
     } 

     if(after) { 
      after(); 
     } 
    };      
    xhttp.open("GET", "/curr_card/", true); 
    xhttp.send(); 
} 

window.onload = updateCard; 

var updateCardRunning = false; 
setInterval(function() { 
    if(updateCardRunning === true) { 
    console.log('postponing to next schedule'); 
    return; 
    } 

    updateCard(
    function() {updateCardRunning = true;}, 
    function() {updateCardRunning = false;} 
); 
}, 2000); 

か:

function updateCard() {  
    var xhttp = new XMLHttpRequest(); 
    window.xhttp = xhttp; 

    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      card = JSON.parse(this.responseText); 
      document.getElementById("season").innerHTML = card.season; 
     } 
    }; 

    xhttp.open("GET", "/curr_card/", true); 
    xhttp.send(); 
} 

window.onload = updateCard; 
setInterval(function() { 
    if(window.xhttp) { 
    window.xhttp.abort(); 
    } 
    updateCard(); 
}, 2000); 
関連する問題