我有一个行为主题的服务似乎没有在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;
}
答案 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
在必要时触发它自己,因为其他逻辑看起来还不错。