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