我开始使用Angular2 Observable
,但是找不到与.then
一起使用的Promises
类似的东西。
这就是我要完成的。
来自header.component.ts的代码
public login() {
this._user = AuthService.getInstance().login(this._loginInfo);
}
来自auth.service.ts的代码
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.subscribe(user => {
return new User(user);
});
有了 promise ,
login
函数将返回Promise,最终将转换为服务器的实际响应。但是使用Observable,这将无法工作。有没有办法做类似的事情?我想避免需要将订阅放入
component
的login
函数中。我希望能够完成服务中的所有工作,并将实际对象返回给component
。另外,我尝试使用
Promise
创建toPromise
,但是我一直在获取toPromise is not a function
。ps。 _httpClient是我对angular2 http的包装,在其中我通过添加一些 header 等来准备请求。
编辑
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.toPromise(). <-- i keep getting that it is not a function
then(user => {
return new User(user);
});
通过这样做,我的组件将获得对象(这是它所需要的),并且在服务中,我可以做其他事情(例如,一旦登录他,就将用户保存到localstorage)。
然后我切换到
Promise
,因为对Observable
进行的操作不起作用(或者我做错了)?我看到返回的对象是Observable的(在调用toPromise之前),但是我确实没有看到
toPromise
函数。 最佳答案
当您调用subscribe(...)
时,返回的Subscription
没有toPromise()
。如果将代码从subscribe
移到map
,则可以使用toPromise()
代替subscribe
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.map(user => {
return new User(user);
}).toPromise();
然后调用者将获得一个
Promise
,他可以在其中使用该值public login() {
this._user = AuthService.getInstance().login(this._loginInfo)
.then(result => {
doSomething();
});
}
但是如果省略`.toPromise()并且调用方像
public login() {
this._user = AuthService.getInstance().login(this._loginInfo)
.subscribe(result => {
doSomething();
});
}
唯一的区别是
subscribe()
而不是then()
,并且如果库的用户更喜欢反应式样式,那么他将更喜欢像过去一样使用subscribe()
。