【问题标题】:Rxjs angular2 subject is not invoking subscribe functionRxjs angular2主题没有调用订阅功能
【发布时间】:2017-07-24 14:35:37
【问题描述】:

我是 rxjs 的初学者,目前在调用 subscribe 函数时遇到问题。我的代码是这样的:

组件 A:

getAllData() {
    this.dataService.getDataA().subscribe(
    data => console.log(data))
}

数据服务:

getDataA() {
    let url = "/services/data";
    return this.getData(url)
}

getData() {
//first without JWT
    let sub = new Subject<Response>();
    this.http.get(param1)
        .subscribe(
            res => sub.next(res)
            err => {
                //401 without JWT so I call authService
                this.authServ.getDataWithToken().subscribe(
                    data => sub.next(data)
                )} 
    return sub.asObservable()
}



getData2() {
    //first without JWT
    let sub = new Subject<Response>();
    this.http.get(param1)
        .subscribe(
            res => sub.next(res)
            err => {
                //401 without JWT so I call authService
                this.authServ.getDataWithToken().subscribe(
                    data => sub.next(data)
                )} 
    return sub.asObservable()
}

身份验证服务:

getDataWithToken() {
    let sub = new Subject<Response>()
    this.getToken().subscribe(
        token=> {
        //reachable just once
            this.http.get(url, new RequestOption(tokenHeader))
            .subscribe(
              data => sub.next(data)
            )
    return sub.asObservable();
}


getToken(url) {
    let sub = new Subject<string>();

    if (this.tokens[url])
        // token is already in memory - console log proves it's reachable
        sub.next(this.tokens[url])
    else {
        // also reachable
        this.http.get(newToken).subscribe(
            (data) => sub.next(data))

    return sub.asObservable()
}

问题是,当我尝试使用令牌到达两个重新端点 -> 进入身份验证服务时,只有第一个正常工作,第二个卡在 authService.getDataWithToken.subscribe 中,它似乎正在等待数据但什么都没有发生。我找到了一种解决方法(真的很脏),如果我在服务中复制函数 getData 并从一个组件中调用 getData 并从另一个组件中调用 getData2,它就可以工作。

我知道,有更多订阅,这可能是问题所在。但是有人能解释一下为什么会这样吗?

【问题讨论】:

  • 请更新并整理您的代码。很难看到发生了什么——特别是因为它不是有效的 JS,所以人们需要猜测什么是正确的。有关如何执行此操作的帮助:stackoverflow.com/help/mcve
  • 我更新了我的代码。不幸的是,我无法提供有关代码的更多详细信息。但是这个伪代码完全模拟了我的情况
  • Psuedocode 对我们来说很难诊断出您的问题所在 - 您可以创建一个 plunker 示例来演示问题吗? here is a template to get started

标签: angular rxjs jwt angular2-services


【解决方案1】:

您可以尝试用此代码替换您的 getToken,我想您在订阅之前发送了带有主题的令牌

getToken(url) {
    let sub = new Subject<string>();
    if (this.tokens[url])
    // token is already in memory - console log proves it's reachable 
    {
        return Observable.of(this.tokens[url])
    } else { // also reachable 
        this.http.get(newToken).subscribe((data) => sub.next(data))
        return sub.asObservable()
    }
}

【讨论】:

  • 我可以试一试,为什么第一次有效,第二次没有收到数据前没有订阅?
  • 第一次是打服务器?第二次尝试使用缓存?
  • 因为如果是这种情况,当 http 返回并且 sub.next 通知订阅时,您已经订阅了 sub。如果第二个调用从缓存中获取它,那么当您使用 sub.next(this.tokens[url]) 发送令牌时您没有订阅,并且如果您使用主题而不是 Observable,另一个订阅将永远等待响应您需要确保在调用 sub.subscribe 之后调用 sub.next 以不丢失值。
  • 另外写代码的时候请尽量使用一致的名字,这个比较难追踪。
  • 非常感谢 Nicu,它正在工作。对不起我的脏代码示例,这不是我的代码,这应该只是模拟我的情况,但我明白下次我会写得更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多