我开始使用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,这将无法工作。

有没有办法做类似的事情?我想避免需要将订阅放入componentlogin函数中。我希望能够完成服务中的所有工作,并将实际对象返回给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()

09-13 14:30