【问题标题】:Endless HTTP Stream Observable not emitting anything but data transferredEndless HTTP Stream Observable 除了传输的数据外不发射任何东西
【发布时间】:2017-05-21 07:38:07
【问题描述】:

我一直在挖掘 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 response是一个无穷无尽的二进制数据,我需要把它处理成字符串数组。

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

【问题讨论】:

  • 我不明白这个问题是关于什么的。你在哪里打电话postActionGivenDataBinaryResponse?您期望在哪里获得价值但没有得到价值?
  • @GünterZöchbauer,我为这个问题评论了我的代码。该功能只是一个POST。我希望数据会由块发出,但它现在永远不会发出,但调试显示数据传输没有问题。需要知道为什么。
  • @tomriddle_1234 您在文档中哪里看到 Angular Http.post 方法返回了一个 Observable,为响应中收到的每个字节发出一个事件?你为什么做出这样的假设?
  • @JBNizet,我想知道如何解决我的情况,你是说我不应该使用 Angular 的 HTTP 模块吗?我只需要接收到的每个数据块的 http 发出事件。怎么样?
  • 我不清楚。但如果可能的话,我猜你将不得不使用较低级别的机制,直接使用 XMLHttpRequest。

标签: angular rxjs observable


【解决方案1】:

我假设您在网络选项卡上看到了从服务器发送的响应,但它是从地图操作员那里得到的。我只是猜测问题可能在于您如何在地图中使用函数 extractBinaryData() 。相反,你能不能不使用这个功能而只做一个 .map(res => res) 或删除它。我假设地图内的“this”引用不是包含 extractBinaryData() 方法的对象。请试试这个,如果它解决了问题,请告诉我们。

【讨论】:

  • 我不这么认为,当我深入研究时,它看起来是 Angular 直到版本 4.x,仍然不支持其 HTTP 模块的无限流。
【解决方案2】:

我通过 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多