2017-06-05 5 views
0

xmlHTTPRequestを使用してエンドレスモーションJPEGデータストリームからデータを取得する必要があり、responseTextがリクエストを完了することなくデータを取り込むことができる素晴らしいトリックが聞こえました。今私は問題に遭う。エンドレスストリーミングリクエストでresponseTextのメモリを解放する方法はありますか?

私のリクエストは、このように観測可能なRxJSとバインドされています。コードの

postActionGivenDataBinaryStream(url:string, data:string) : Observable<any>{ 

    this.binary_progress_call_accum = 0 ; 
    this.previous_length = 0 ; 

    return Observable.create((observer)=>{ 
     let xhr = new XMLHttpRequest() ; 

     xhr.open('POST',url,true) ; 
     xhr.setRequestHeader("Content-Type","application/json;charset=utf-8"); 
     //this way the binary data keeps populate at state 3 
     xhr.overrideMimeType('text\/plain; charset=x-user-defined'); 

     xhr.onreadystatechange =() =>{ 
      if (xhr.readyState === 4) { 
       if (xhr.status === 200) { 
        this.binary_progress_call_accum = 0 ; 
        this.previous_length = 0 ; 
        observer.complete(); 
       } else { 
        this.binary_progress_call_accum = 0 ; 
        this.previous_length = 0 ; 
        observer.error(xhr.response); 
       } 
      } 
     } 
     xhr.onprogress = (event)=>{ 
      let outstring:string = ""; 
      //should preordically emit the response text 

      if (this.binary_progress_call_accum > 1) { 
       //just send the next piece of data 
       let endCount = xhr.responseText.length ; 

       //so here try to next a string 

       for (let i = this.previous_length ; i < endCount; ++i){ 
        outstring += ("00" + (xhr.responseText.charCodeAt(i) & 0xFF).toString(16)).slice(-2) ; 
       } 

       observer.next(outstring) ; 
       this.previous_length = endCount ; 
      } 
      else{ 
       for (let i = 0 ; i < xhr.responseText.length; ++i){ 
        outstring += ("00" + (xhr.responseText.charCodeAt(i) & 0xFF).toString(16)).slice(-2) ; 
       } 
       observer.next(outstring) ; 
       this.previous_length = xhr.responseText.length ; 
      } 

      this.binary_progress_call_accum += 1; 
     }; 

     xhr.send(data) ; 

     //https://stackoverflow.com/a/38622923/921082 
     //elegantly abort() 
     return() => xhr.abort() ; 
    }) ; 

} 

しかし、この作品は、深刻な問題を抱えている、私はそれが時々立ち往生、30秒間隔で観測可能これを呼び出さず。私の間隔が観測されると、リクエストは30秒間だけ遅延します!何もせずにコンソールログには何も表示されません。

私はそれが完了する前にxhr.abort()が時間がかかりすぎると思っています。観測可能な間隔は次の要求を与えます。これは前の要求と競合し、要求応答の遅延を引き起こします。だから、responseTextのメモリをリリースする方法はありますか?

答えて

0

これは難しいようですが、実際に解決しました。

答えは上記のコードとは関係ありませんが、コードはこの要求を観測可能と呼びます。

IntervalObservableの代わりにrepeatWhenを使用します。 IntervalObservableはリクエストが実際に完了したかどうかは気にしないので、最後のリクエストが完了する前に要求がトリガーされます。 repeatWhenは、次の開始前に実際に完了した最後の観測を保証します。

これを確認してください。https://github.com/ReactiveX/RxJava/issues/448

関連する問題