2016-03-24 30 views
2

为了使用角度2和rxjs,我遇到了问题。了解角度和HTTP的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(..) 
    } 
} 

现在首先是不会工作的,因为在AuthServicelogin现在返回Subscription对象,而不是一个Observable,在addtional如果拿在login功能和重构它这样:

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

这会导致HTTP请求来调用两次..

所以我的问题是:我怎么知道我的loginPage调用onLoginSuccess的用户完成了?

我该如何避免2次请求?

回答

3

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; 
    } 
} 
+0

请分享一些更多详情?这和'do'有什么区别? – tubu13