javascript - http post-prenumeration och try catch
Jag använder Angular2:s http.post och ibland skickas inte headers till CORS-servern. Så jag vill försöka tills förfrågan lyckas. Men den här koden fastnar i en oändlig loop?
var headers = new Headers();
headers.append('Content-Type', 'text/plain');
this.again = true;
while (this.again==true) {
http.post('https://localhost:44300/account/getip', "", { headers: headers })
.subscribe(
(res2) => {
try {
this.ip = res2.json();
this.ipstr = this.ip.replace(/\./g, '-');
this.again = false;
}
catch (err) {
console.error(err);
}
}
);
}
Svar #1
Om du vill fånga fel från begäran kan du antingen:
Använd den andra återuppringningen av
subscribe-metoden:http.post('https://localhost:44300/account/getip', "", { headers: headers }) .subscribe( (res2) => { (...) }, (error) => { (...) } ); }Använd
catch-operatorn:http.post('https://localhost:44300/account/getip', "", { headers: headers }) .catch((error) => { (...) }) .subscribe( (res2) => { (...) } ); }
När det gäller att försöka göra förfrågningar igen kan du använda retry-operatorn på detta sätt (med en timeout):
this.http.get('https://localhost:44300/account/getip',
{ search: params })
.retryWhen(error => error.delay(500))
.timeout(2000, return new Error('delay exceeded'))
.map(res => res.json().postalCodes);
Du kan se användningen av delay för att vänta en viss tid innan du utför en ny förfrågan...
Denna artikel kan också intressera dig:
- https://jaxenter.com/reactive-programming-http-and-angular-2-124560.html
Svar #2
Du kan använda retry-operatorn:
http.post('https://localhost:44300/account/getip', "", { headers: headers })
.retry(3)
.subscribe((res2) => {
this.ip = res2.json();
this.ipstr = this.ip.replace(/\./g, '-');
})
