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
のメモリをリリースする方法はありますか?