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