我开始使用Angular2 Observable,但是我找不到与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,最终将转换为服务器的实际响应。但是用可观察的方式,这不会奏效。
有没有办法做类似的事情?我想避免在组件的登录功能中放置订阅。我想要能够完成所有的工作,并将实际的对象返回到组件。
此外,我试图创建Promise,与Promise,但我不断得到Promise不是一个功能。
附: _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); });
通过这样做,我的组件将获得对象(这是它需要的),并且在服务中,我可以做其他的事情(如保存用户到本地存储,一旦我登录他)。
而我转而承诺,因为与Observable做同样的事情是不行的(或者我做错了)?
当您拨打订阅(…)时,将返回没有toPromise()的订阅。如果您将代码从订阅移动到地图,您可以使用Promise()而不是订阅
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()。