web-dev-qa-db-fra.com

Délai d'attente Angular2 dans la demande de publication http

Est-il possible de faire un timeout de 3 secondes dans une post-demande? Comment ?

Mon code pour le moment

this.http.post('myUrl', 
    MyData, {headers: Myheaders})
        .map(res => res.json())
        .subscribe(
            data => this.ret = data,
            error => console.debug('ERROR', error),
            () => console.log('END')
        );
17
Raph

Vous pouvez utiliser l'opérateur timeout comme ceci:

this.http.post('myUrl', 
        MyData, {headers: Myheaders})
         .timeout(3000, new Error('timeout exceeded'))
         .map(res => res.json())
         .subscribe(
           data => this.ret = data,
           error => console.debug('ERROR', error),
           () => console.log('END')
         );
35
Thierry Templier

Vous devrez peut-être importer le délai d'expiration comme ceci

import 'rxjs/add/operator/timeout'

Je ne pourrais pas le faire fonctionner sans cela sur rxjs 5.0.1 et angular 2.3.1

Modifier le 20 avril 2018

veuillez ne pas importer d'opérateurs de cette façon, dans rxjs +5.5 vous pouvez importer des opérateurs comme celui-ci avec

import { timeout } from 'rxjs/operators/timeout';
// Use it like so
stream$.pipe(timeout(3000))

Veuillez vérifier ce document qui explique en détail les opérateurs canalisables.

19
realappie

J'ai modifié la réponse de Thierry pour la faire fonctionner avec la dernière version. Il est nécessaire de supprimer le deuxième paramètre de la fonction timeout. Selon une discussion concernant un problème angular-cli, la fonction timeout lève toujours une TimeoutError maintenant.

this.http.post('myUrl', 
    MyData, {headers: Myheaders})
     .timeout(3000)
     .map(res => res.json())
     .subscribe(
       data => this.ret = data,
       error => console.debug('ERROR', error),
       () => console.log('END')
     );
12
Peter