http - 使用 Angular 和 HTTP 了解 rxjs

标签 http angular rxjs

我正在使用 Angular 2 和 rxjs,但遇到了问题。

我正在尝试进行基本登录:这是代码:

class LoginPage{
    ctor(private auth:AuthService) {}

    login(cred) {
        this.auth.login(cred).subscribe( res=> this.navigateToHome()
    }
}

class AuthService {
    ctor(private http:AuthHttp) {}

    login(cred){
        return this.http.post(url, cred).subscribe(res => this.onLoginSuccess())

     }
}

class AuthHttp extends Http {
   ctor (.....)

   post(...) {
     // Add some headers
      return super.post(..)
   }
}

现在首先无法工作,因为 AuthService 中的 login 现在返回 Subscription 对象,而不是 Observable code>,此外,如果采用 login 函数并像这样重构它:

login(cred) {
   var obs = this.http.post(url, cred)
   obs.subscribe(res=> this.onLoginSuccess())
   retrun obs
 }

这会导致 http 请求调用两次..

所以我的问题是:我如何知道我的 loginPage 调用 onLoginSuccess 的订阅者已完成?

如何避免两次请求?

最佳答案

怎么样share()

如果您需要订阅AuthService.login(),则login()必须返回Observable。但是您还需要在 AuthService 内登录时执行一些操作,不是吗? share() 让您可以在 AuthService 内登录时订阅并返回 Observable

class AuthService {
    ctor(private http:AuthHttp) {}

    login(cred){
        var result = this.http.post(url, cred).share();
        result.subscribe(res => this.onLoginSuccess())
        return result;
     }
}

关于http - 使用 Angular 和 HTTP 了解 rxjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209122/

相关文章:

php - 使用 PHP 代码通过 Web 服务器从应用程序上传本地文件到 FTP 服务器

Angular flexLayout 组件重叠

rx-java - RxJs 中 Observable.expand() 的 RxJava 等价物是什么?

javascript - 如何让 async/await 等待 Observable 返回

linux - 如何在 GoDaddy 的网络托管服务上提供没有扩展名的文件?

javascript - 如何让我的 CSS 和 JS 文件发送 HTTP 响应 header

angular - 如何在 Angular 2 中集成 JWplayer

angular: LOCATION_INITIALIZED 它是什么,为什么要使用它?

javascript - RxJS 中的同步性

javascript - 尝试使用 Pusher 读取交换数据