【发布时间】:2016-08-07 11:49:09
【问题描述】:
我开始使用 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。
另外,我尝试使用toPromise 创建Promise,但我不断收到toPromise is not a function。
附言_httpClient 是我围绕 angular2 http 的包装器,在其中我通过添加一些标头等来准备请求。
编辑
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);
});
通过这样做,我的组件将获得对象(这是它所需要的),并且在服务中我可以做其他事情(比如将用户保存到本地存储,一旦我登录他)。
然后我切换到Promise,因为对Observable 做同样的事情不起作用(或者我做错了)?
我看到返回的对象是 Observable(在调用 toPromise 之前),但我确实没有看到 toPromise 函数。
【问题讨论】:
-
“我希望能够在服务中完成所有工作,并将实际对象返回给组件。” - 你不能这样做,因为
httpClient.post是异步的,所以如果你使用Promise你需要为then函数提供回调,如果你使用RxJS Observable,你需要为subscribe函数提供回调。 ES6 中的 async/await (ponyfoo.com/articles/understanding-javascript-async-await) 可以让你的代码看起来像线性的,但它通过在下面使用回调来工作。
标签: angular promise rxjs observable