我一直在使用Angular 1大约1。5年,我现在正在尝试学习Angular 2.我已经创建了一个简单的Blog应用程序来测试它。当我尝试POST到Web服务时,我的POST出现了错误。更大的问题是,catch()块中的代码没有执行。并且调用本身并未显示在Fiddler或浏览器的“网络”选项卡中,因此错误优先于任何网络或Web API问题。由于catch()失败了,我没有什么可继续的。这是我的代码片段,以及显示吞下错误的视频。有什么想法吗?
https://www.screencast.com/t/ibxB9hBDYXLn
insertPost(post: Post) {
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
// let jsonPost = JSON.stringify(post);
let url = 'http://localhost:53757/api/Posts';
return this.http
.post(url, post, options)
.map((response: Response) => { // This is where the error occurs
let ret = <string>response.json(); // This line never executes
return ret;
})
.do(data => console.log(data))
.catch((err: Response) => { // The error is caught here, BUT...
let details = err.json(); // This line never executes either
console.log('Error: ' + details);
return Observable.throw(details);
});
// .catch(this.handleError);
}
private handleError(error: Response) {
console.error(error);
let msg = `Error status code ${error.status} at ${error.url}`;
return Observable.throw(msg);
}
更新:所以我想出了部分内容。看来这是一个Observable,所以我需要订阅它才能使它工作。我仍然不太了解Promises新的范式转变。所以,这有效:
insertPost(post: Post) {
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
let url = 'http://localhost:53757/api/Posts';
let postResponse;
return this.http
.post(url, post, options)
.map((res: Response) => res.json())
.subscribe((res: Post) => postResponse = res);
}
现在问题是,我怎么知道这个HTTP调用何时完成,以便我可以调用重定向来查看新帖子?在Angular 1和promise中,我可以使用.then()调用(来自调用服务的函数),这样我就可以在帖子完成后调用重定向。使用observable时如何才能完成这项工作?