2017-05-21 7 views
0

私はAngular 4とRxJSの問題を掘り下げました。ここで私のコードは、問題は、http.post要求オブザーバブルは、チェーンの次の、map()に何も発光していないです。 POSTは無限の応答を得て、それはMotion JPEGデータのストリームです。今私はデータを扱わなければなりません、それぞれ500KBが転送されたと言う。私の問題は、Observableが何も放出していなければ、データで何もできないということです。Endless HTTP Stream Observableはデータ転送以外のデータを送信しません

どのようにして、このような角張ったHTTP機能をチェーンの次の部分に送信するのですか?

postActionGivenDataBinaryResponse(url:string, data:string) : Observable<any>{ 
    let headers = new Headers ({ 
     'Content-Type' : 'application/json;charset=utf-8' 
    }) ; 
    let options = new RequestOptions({ 
     headers : headers, 
     responseType: ResponseContentType.ArrayBuffer 
    }) ; 

    //return binary data as is no json 
    return this.http.post(url, data, options) //suspecting here is not emitting anything due to unknown configuration issue. 
        .map(this.extractBinaryData) 
        .catch(this.handleError) ; 
} 

private extractBinaryData(res:Response){ 
    console.log('Dealing with data in the com service.') ; // this never runs 
    return res ; 
} 

私は上記の関数をこのように呼びます。応答は無限のバイナリデータです。文字列配列として処理する必要があります。

this.mySubscription = this.comService.postActionGivenDataBinaryResponse(myurl,mydata) 
    .do(()=>{ 
       console.log('Observable Passed data.') ; //this never runs. 
      }) 
    .bufferCount(128000) 
    .map((data)=>{//process the data each 128kb chunk}) 
    .subscribe(); 
+0

私は質問が何であるか分かりません。あなたは 'postActionGivenDataBinaryResponse'をどこで呼びますか?あなたはどこの価値を期待していますか? –

+0

@GünterZöchbauer、私は問題のために私のコードをコメントしました。その機能は単なるPOSTです。私はデータがチャンクによって放出されると期待していますが、今は放出されませんが、デバッグはデータが問題なく転送されることを示しています。理由を知る必要がある。あなたは角度Http.post方法が応答で受信すべてのバイトについて観測発光イベントを返されたドキュメントで見たのtomriddle_1234 @ –

+0

?なぜあなたはその前提を作るのですか? –

答えて

0

私はこの問題を、MDNが提供したトリックで解決しました。 It's about how to transfer binary data

私はAngularのHTTPモジュールを使用する代わりに、自分のリクエストを書いていました。

そして、responseTextトリックを利用してリクエストを終わらせないようにしましょう。要求が似ている

function load_binary_resource(url) { 
    var req = new XMLHttpRequest(); 
    req.open('GET', url, false); 
    //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com] 
    req.overrideMimeType('text\/plain; charset=x-user-defined'); 
    req.send(null); 
    if (req.status != 200) return ''; 
    return req.responseText; 
} 

は、私はちょうど観測可能にこれをラップする必要があり、そのデータはストリーミングを続けるだろうとの要求がabort()でない限り、決して停止しません。

0

ネットワークタブでサーバーから送信された応答が表示されているものの、マップ演算子からその応答が出ているとします。私は、あなたがmap内でextractBinaryData()関数をどのように使用したかに問題があると推測しています。代わりに、関数を使用せずに、単に .map(res => res)を実行するか、それを削除することができますか?マップ内の「this」参照がextractBinaryData()メソッドを保持するオブジェクトではないと仮定しています。これを試して問題が解決した場合はお知らせください。

+0

バージョン4.xまでのAngularはHTTPモジュールの無限ストリームをまだサポートしていないと思います。 –

+0

更新していただきありがとうございます.. – Sundar

関連する問題