2017-05-17 2 views
0

Ich möchte eine Antwort von meiner API ignorieren, wenn es zu lange dauert. Ich verwendeAngular 2 - Abbrechen eines Abonnements nach einer Zeitüberschreitung

this.http.get(mysqlUrl).subscribe() 

, um die Antwort zu erhalten. Aber ich möchte dieses Abonnement kündigen, wenn es länger als 5 Sekunden dauert, um zu beenden. Ich weiß, ich kann uns abmelden(), aber wie kann ich das mit einem Timeout-Wert verknüpfen?

Danke!

Antwort

3

Ein einfacher setTimeout sollte funktionieren:

let subscription = this.http.get(mysqlUrl).subscribe(...); 

setTimeout(() => subscription.unsubscribe(), 5000); 
+0

ich verwendet habe setTimeout() mir viel, aber die Trend scheint nicht SetTimeout in Begleiter mit Angular (zumindest mit AngularJS gibt es die $ timeout service) ... – DotBert

+2

Ich denke Leute mögen es einfach nicht, wenn 'setTimeout' als Hack benutzt wird. Aber in diesem speziellen Fall möchten Sie eigentlich auf eine Zeitüberschreitung warten. Angular 2 patcht auch Async-Funktionen wie 'setTimeout', also verhält es sich wie '$ timeout' in Angular 1. –

5

Sie den Operator takeUntil verwenden:

this.http.get(mysqlUrl) 
    .takeUntil(Observable.of(true).delay(5000)) 
    .subscribe(...) 
+0

Je mehr ich' rxjs' verwende, desto mehr mag ich diese Antwort, da Sie das Subscription nicht speichern müssen eine Variable. Ich bin einfach nicht verrückt nach "importieren" rxjs/add/operator/takeUntil '; importiere 'rxjs/add/beobachtbar/von'; Importieren Sie 'rxjs/add/operator/delay''. Aber wenn ich viele Abonnements verwalten würde, könnte ich diese Lösung verwenden. –

+0

Für mich hat der TakeUntil nach 5 Sekunden nicht aufgehört. Mein Szenario beinhaltete die Verwendung eines Clickstreams in Verbindung mit einer Switchmap. Der Clickstream bedeutete, dass ich alle laufenden Anfragen abbrechen wollte, wenn ein anderer Klick vor dem ersten Klick kam. – JGFMK

2

import 'rxjs/add/operator/timeout

this.http.get(mysqlUrl) 
    .timeout(5000) 
    .subscribe() 
+0

Wenn Sie ein erfolgreiches Abonnement haben - dh Antwort wird vor den 5 Sekunden zurückgegeben Fehlerbehandlung tritt auch nach den 5 Sekunden auf, also bin ich kein Fan von diesem Ansatz. Es ist eine Schande, dass das erfolgreiche Abonnieren nicht automatisch das Timeout beendet und das war es ... – JGFMK

+0

'.take (1)' könnte das beheben. –

Verwandte Themen