Angular BehaviorSubject不发送下一个

时间:2018-03-19 22:59:16

标签: javascript angular typescript rxjs behaviorsubject

我有一个行为主题的服务似乎没有在next()上发送。

我可以看到,当我在console.log响应

时会触发该方法
errorSubject = new BehaviorSubject<any>(
    {
        exception: false,
        message: '',
        segNum: ''
    }
);
error = this.errorSubject.asObservable();

responseHandler(response) {
    let obj = {};
    if (response.success) {
        return response.payload;
    } else {
        obj = {
            exception: true,
            message: response.exception.message,
            segNum: response.exception.seqNum
        };
    }
    console.log(obj);
    this.errorSubject.next(obj);
}

然后当我订阅它时:

error;
ngOnInit() {
    this.error = this.apiHandlerService.error.subscribe(obj => {
        console.log(obj);
        if (obj.exception) {
            this.openModal();
        }
    });
}

所以我调用的每个API都会通过此方法传递。如果没有返回异常,它会发送有效负载,否则它会将异常发送给错误模式组件。

当我触发其他条件时,似乎是发送了errorSubject的初始值而未获得next()

有什么想法吗?

在下面的答案之后,我尝试重新安排我的方法,以便最后返回。仍然没有工作:

responseHandler(response) {
    let obj;
    if (!response.success) {
        obj = {
            exception: true,
            message: response.exception.message,
            segNum: response.exception.seqNum
        };
        console.log(response);
    } else {
        obj = response.payload;
    }
    this.errorSubject.next(obj);
    return obj;
}

1 个答案:

答案 0 :(得分:1)

我根据提供的代码创建了stackblitz:https://stackblitz.com/edit/angular4-3tvtrt?file=app%2Fapp.component.ts

这里我每隔10秒从组件调用responseHandler方法并手动传递response,每次将segNum变量增加1。看起来它正确更新(您可以在警报中看到更新的数据),因此BehaviorSubject按预期工作。如果您的代码与提供的部分类似,我唯一能想到的就是来自服务器的响应,因此您必须检查开发人员工具中的Network选项卡,并确保您真正得到您期望的结果。

编辑1

问题出在这一部分:

if (response.success) {
  return response.payload; // <- HERE
} else {
  ...
}

当你return时,函数执行在该行停止,并且不会执行该函数的下面代码。因此,在您的情况下,当response获得success == true时,函数执行将停在return response.payload行,并且解释器无法到达行this.errorSubject.next(obj)

编辑2

以下是较新版本:https://stackblitz.com/edit/angular4-3tvtrt?file=app%2Fapp.component.ts

在此,我依次使用2个不同的参数调用responseHandler方法,正如预期的那样,alert正常工作并向我们显示更新的seqNum属性。所以你可以看到&#34; EXCEPTION&#34;在我们不想触发我们的行为主题的控制台中,以及&#34; TRIGGER&#39; NEXT()&#39;&#34;什么时候我们想要请将您的代码与我上次提供的示例进行比较,它现在应该可以正常工作。但是你必须确保responseHandler在必要时触发它自己,因为其他逻辑看起来还不错。