如何使用最后一个Rxjs版本实现http post timeout?

时间:2016-12-25 09:46:03

标签: angular rxjs rxjs5

我曾经为我的angular2 http帖子设置了超时,如下所示:

this.http.post('myurl',
      body, {headers: headers})
      .timeout(2000, new Error('Timeout exceeded'))
      .map(res => res.json())
      .subscribe((stuff) => {
         //Do stuff
      }, (errorResponse: any) => {
        //Manage error
      });

但是对于最新版本的Rjxs(5.0.1),这不再有效。

超时需要一个Observable作为第一个参数,并且不接受" new Error",我该怎么做/写那个?

请您提前寻求帮助

注意:当我删除"新错误(...)"时,我的代码有效,但在运行时,我将面临以下错误

  

错误:未捕获(在承诺中):TypeError:_this.http.post(...)。timeout   不是函数TypeError:_this.http.post(...)。timeout不是   功能

2 个答案:

答案 0 :(得分:10)

知道了,我必须包括以下内容:

import 'rxjs/add/operator/timeout';

this.http.post('myurl',
  body, {headers: headers})
  .timeout(2000)
  .map(res => res.json())
  .subscribe((stuff) => {
     //Do stuff
  }, (errorResponse: any) => {
    //Manage error
  });

****** Angular的更新> = 4.3和Rxjs> = 5.2.2 ******

随着RXJS 5.2的引入,timeout运算符可以使用新引入的pipe来完成。此外,将其作为可调运算符导入可能会减小包大小(如果所有使用的运算符都将导入为lettable)。

Angular 4.3引入HttpClientModule,它会在某些时候取代HttpModule

因此这里更新了代码:

import {timeout} from 'rxjs/operators/timeout'; 

let headers: HttpHeaders = new HttpHeaders();
headers.append('Content-Type', 'application/json');

let body = {something: 'my_value'};

this.http.post('myurl',
  body, {headers: headers})
  .pipe( 
     timeout(2000)
  )
  .subscribe((stuff: any) => {
     //Do stuff
  }, (errorResponse: HttpErrorResponse) => {
    //Manage error
  });

****** Rxjs的更新> = 6 ******

上述代码在Rxjs v6中仍然可以正常工作,但importtimeout管道应该修改如下:

import {timeout} from 'rxjs/operators';

// same as above

答案 1 :(得分:0)

是您需要导入

import 'rxjs/add/operator/timeout';

Fyi,如果您需要,还有其他包可以导入

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/timeout';
...