无限的HTTP流Observable除了传输数据外不会发出任何内容

时间:2017-05-21 07:38:08

标签: angular rxjs observable

我一直在挖掘Angular 4和RxJS的问题。这是我的代码,问题是,http.post请求Observable没有向链的下一个map()发送任何内容。 POST只是得到无尽的响应,它是一个Motion JPEG数据流。现在我必须处理数据,说每个500KB转移。我的问题是,如果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 ;
}

我这样调用上面的函数,post响应是无穷无尽的二进制数据,我需要将它作为字符串数组处理。

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();

2 个答案:

答案 0 :(得分:0)

我假设您在网络选项卡上看到服务器发送的响应,但是它从地图运营商处获得了。我只是猜测问题可能出在你如何在地图中使用函数extractBinaryData()。相反,你可以不使用该功能,只是做一个 .map(res =&gt; res)或删除..我假设地图中的“this”引用不是包含extractBinaryData()方法的对象。如果它解决了这个问题,请试试这个并告诉我们。

答案 1 :(得分: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;
}

我只需要将它包装成一个observable,然后数据将保持流式传输并且永远不会停止,除非请求是abort()