2016-09-28 21 views
1

私は、5ページのドキュメントのチャンクを受け取るようにajaxリクエストを送信する、reactで書かれたwebappを持っています。このため、リクエスト自体は、次の5ページを受信するためのタイムアウトとして再帰的にその関数を呼び出します。Internet Explorerのメモリリーク

追加情報:私はnpmリポジトリから公式のフラックスを使用します。 コードの例次の:

function getPages() { 

    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState === 4 && this.status === 200) { 
      var resp = JSON.parse(this.responseText); 
      SwitchViewAction.addPages(resp); // calls another setTimeout later, 
              // because of react lifecycle 

      if (Object.keys(resp).length > 0) { 
       setTimeout(getPages(), 0); 
      } 
     } 
    }; 

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

問題は、IE 11は、各要求に対してほとんど〜20メガバイトのメモリを割り当てること、である(またはタイムアウト?)。私は〜250ページで文書をレンダリングする場合は、IEがメモリを使い果たして、私は次のエラーを取得:

Not enough storage is available to complete this operation. 

私は this pageを発見し、タイムアウトが削除されることはありませんので、setTimeoutメソッドが内部基準を設定することを説明しています。しかし、IE <のためだけです。したがって、この問題は11ではありません。

Chromeがこれを完全に処理します。この巨大な文書の最大メモリ使用量は約170MBです。 IEは1GB以上を実行し、上記のエラーをコンソールに返します。コードの後半で、配列に "resp"を追加します。私はそれを追加しない場合、IEは〜220MBのメモリ使用量にとどまります。だからimhoには参照問題があるはずです。

詳細情報:ドキュメントページはbase64で送信されます。すべてのページを受け取ったときの最大サイズを計算しました。 249ページの文書の場合は162MBです。

これはIEが参照を処理する際の問題ですか?IEはメモリを解放しないのですか、まったく間違ったトラックですか?だから、それはどうしたのだろう?

+0

最初にお読みください:https://msdn.microsoft.com/en-us/library/bb250448(v=vs.85).aspx –

答えて

0

タイムアウト構文は、あなたがこのようにそれを呼び出す必要があり、正しくない:

setTimeout(getPages, 0); 

そうしないと、すぐに関数を呼び出すと、実際に以前の機能の状態はゴミを取得することはありません呼び出すとメモリ不足になり集めました。

+0

ありがとうございますが、残念ながらそれは助けになりませんでした。今のところ、それは問題に反応するようです。レンダリングすると、メモリが爆発します。 chromeやfirefoxなどの他のブラウザでも処理できます。私は検索しています。 – Obstc0rp

0

問題は、base64文字列を画像としてレンダリングしながらIEがメモリを無駄にするという点です。私にとっての解決策は、ドキュメント全体ではなく、ページだけをレンダリングすることです。