Angular 角度2可观察和承诺

Angular 角度2可观察和承诺,angular,promise,rxjs,observable,Angular,Promise,Rxjs,Observable,我开始使用Angular2Observable,但我找不到类似于的东西。然后,我使用了Promises 这就是我想要完成的 来自header.component.ts的代码 来自auth.service.ts的代码 有了承诺,login函数将返回承诺,该承诺最终将转换为来自服务器的实际响应。但在可观察的情况下,这是行不通的 有没有办法做类似的事情?我想避免在组件的登录功能中加入订阅。我希望能够在服务中完成所有工作,并将实际对象返回到组件 另外,我试图用toPromise创建Promise,但我一

我开始使用Angular2
Observable
,但我找不到类似于
的东西。然后,我使用了
Promises

这就是我想要完成的

来自header.component.ts的代码 来自auth.service.ts的代码 有了承诺,
login
函数将返回承诺,该承诺最终将转换为来自服务器的实际响应。但在可观察的情况下,这是行不通的


有没有办法做类似的事情?我想避免在
组件
登录
功能中加入订阅。我希望能够在服务中完成所有工作,并将实际对象返回到
组件

另外,我试图用
toPromise
创建
Promise
,但我一直得到
toPromise不是一个函数

p、 s._httpClient是我对angular2 http的包装,在其中我通过添加一些头等来准备请求

编辑
返回此信息。_httpClient.post('LoginAction',凭证)
.map(res=>res.json())
.toPromise()。{
返回新用户(用户);
});
通过这样做,我的组件将获得对象(这是它所需要的),并且在服务中我可以做其他事情(比如在我记录用户之后将其保存到localstorage)

我切换到了
Promise
,因为对
Observable
做同样的事情不起作用(或者我做错了)


我看到返回的对象是可观察的(在调用toPromise之前),但我确实没有看到
toPromise
函数。

当您调用
subscribe(…)
时,返回的
Subscription
没有
toPromise()
。如果将代码从
subscribe
移动到
map
,则可以使用
toPromise()
而不是
subscribe

返回此信息。_httpClient.post('LoginAction',凭证)
.map(res=>res.json())
.map(用户=>{
返回新用户(用户);
}).toPromise();
调用方将得到一个
承诺
,在那里他可以使用

公共登录(){
this.\u user=AuthService.getInstance().login(this.\u loginInfo)
。然后(结果=>{
doSomething();
});
}
但是如果省略`.toPromise(),调用方使用它时

公共登录(){
this.\u user=AuthService.getInstance().login(this.\u loginInfo)
.订阅(结果=>{
doSomething();
});
}

其中唯一的区别是
subscribe()
而不是
then()
,如果库的用户更喜欢反应式样式,他将更喜欢像他习惯的那样使用
subscribe()

您需要像

import 'rxjs/add/operator/toPromise';

干杯

来自Angular2文档

我们建议在
rxjs extension.ts

```
// Observable class extensions 
   import 'rxjs/add/observable/of'; 
   import 'rxjs/add/observable/throw';

// Observable operators 
   import 'rxjs/add/operator/catch'; 
   import 'rxjs/add/operator/debounceTime'; 
   import 'rxjs/add/operator/distinctUntilChanged'; 
   import 'rxjs/add/operator/do'; 
   import 'rxjs/add/operator/filter'; 
   import 'rxjs/add/operator/map'; 
   import 'rxjs/add/operator/switchMap'; 
```
并将其导入到app.module.ts
(根模块)

导入“/rxjs扩展名”;


这将有助于我们防止进一步的错误。

subscribe
返回一个
一次性的
而不是一个订阅
subscribe(observer或ext?:PartialObserver |((value:T)=>void),error?:(error:any)=>void,complete?:()=>void):订阅我不知道你从哪里得到它,看这里:。可能是rxjs4。Angular使用rxjs5。@GünterZöchbauer感谢您的帮助。请检查我编辑的问题,我试图进一步澄清。“我希望能够在服务中完成所有工作,并将实际对象返回到组件。”-您不能这样做,因为
httpClient.post
是异步的,所以如果您使用Promise,您需要为
然后
函数提供回调,或者,如果您使用RxJS Observable,则使用订阅功能。ES6()中有async/await,可以使代码看起来像线性的,但它通过在下面使用回调来工作。
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);
});
import 'rxjs/add/operator/toPromise';
```
// Observable class extensions 
   import 'rxjs/add/observable/of'; 
   import 'rxjs/add/observable/throw';

// Observable operators 
   import 'rxjs/add/operator/catch'; 
   import 'rxjs/add/operator/debounceTime'; 
   import 'rxjs/add/operator/distinctUntilChanged'; 
   import 'rxjs/add/operator/do'; 
   import 'rxjs/add/operator/filter'; 
   import 'rxjs/add/operator/map'; 
   import 'rxjs/add/operator/switchMap'; 
```