我一直在挖掘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();
答案 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()
。