typescript - Angular Http fungerar inte. Promise blandat med Observable-ansats
Jag försöker skicka datan till backend Node js-fil från Angular. Efter att formuläret skickas kallas nedanstående funktion:
cmdSubmit() : void
{
console.log(this.cli);
this.Cliservice.postdata(this.cli)
.then(clidata => this.clidata.push(clidata),
error => this.errorMessage = <any>error);
}
postdata funktionskod:
postdata(obj: any): Promise<any> {
alert('hello');
let body = JSON.stringify({ obj });
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.post(this.runUrl, body, options)
.map(this.extractData)
.catch(this.handleError);
/*return this.http.post(this.runUrl, body, options)
.map(this.extractData)
.catch(res => {
// do something
// To throw another error, use Observable.throw
return Observable.throw(res.json());
});*/
}
private extractData(res: Response) {
let body = res.json();
return body.data || { };
}
private handleError (error: any) {
// In a real world app, we might use a remote logging infrastructure
// We'd also dig deeper into the error to get a better message
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg); // log to console instead
return Observable.throw(errMsg);
}
}
Men ingenting händer här. Jag får inget felmeddelande. Kan du vänligen föreslå något om detta?
Svar #1
Varje Http-funktion som returnerar Observable måste ha en .subscribe()-metod kopplad till sig. Om du missar denna metod kommer förfrågan inte att utföras. Så koppla .subscribe()-metoden till varje funktion.
Som det har sagts i kommentarerna, använder du två tillvägagångssätt: Promise-stil och Observable-stil, så jag råder dig att använda en gemensam stil.
this.http.post(this.runUrl, body, options)
.map(this.extractData).subscribe(/*here your parameters*/);
Svar #2
Det @Suren nämnde är helt korrekt. Som ett alternativ kan du också använda toPromise()-metoden på detta för att direkt konvertera det till ett Promise-objekt:
return this.http.post(this.runUrl, body, options).toPromise();
För detta behöver du importera följande
import 'rxjs/add/operator/toPromise'
