2016-12-25 3 views
4

Я использовал, чтобы установить тайм-аут для моей angular2 HTTP POST, как следующее:Как реализовать тайм-аут HTTP после последней версии Rxjs?

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) это не действует больше.

Тайм-аут необходим для наблюдения как первый параметр и не принимает «новую ошибку», как мне это сделать/записать?

Thx заранее за вашу помощь

Примечание: Когда я удалить «новый Error (...)», мой код действителен, но во время выполнения, я собирающийся лицо следующее сообщение об ошибке

Error: Uncaught (in promise): TypeError: _this.http.post(...).timeout is not a function TypeError: _this.http.post(...).timeout is not a function

ответ

7

Понял, я должен был включать в себя следующее:

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

****** UPDATE для угловому> = 4,3 и Rxjs> = 5.2.2 ******

С внедрением RXJS 5.2 оператор timeout может быть выполнен с использованием только что введенного pipe. Кроме того, импорт его как операторов lettable может уменьшить размер пакета (в случае, если все используемые операторы будут импортированы как lettable).

Угловой 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 
    }); 
+0

Проверить вопрос, ответил, пожалуйста, –

+0

Да, это было потрясающее изменение, когда они переместились на 5.0 https://github.com/ReactiveX/rxjs/commit/98 ea3d221e0b1c2da66e09b525a165abfa7fb460 – shusson

+0

где это сообщение «Время ожидания превышено»? – user630209

0

Да Вы должны импортировать

import 'rxjs/add/operator/timeout'; 

FYI, у вас есть другой пакет для импорта, если вам нужно их

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

С Rxjs> = 5.2 таймаут может быть импортирован как оператор lettable, такой как 'import {timeout} из 'rxjs/operator/timeout';' я обновил свой ответ на примере –