Javascript next()don';t通知订阅()
我有一些服务Javascript next()don';t通知订阅(),javascript,angular,rxjs,Javascript,Angular,Rxjs,我有一些服务 isDocAdd: Subject<boolean> = new Subject<boolean>(); addDocument(header) { return this.http.post(this.addHl7DocumentUrl, header) .map((response: any) => { if (response.status === '404') {
isDocAdd: Subject<boolean> = new Subject<boolean>();
addDocument(header) {
return this.http.post(this.addHl7DocumentUrl, header)
.map((response: any) => { if (response.status === '404') {
this.isDocAdd.next(true);
}
else {
this.isDocAdd.next(false);
}
return response;
})
.catch((error: Error) => {
console.error('Error:', error);
return Promise.reject(error.message || error);
});
}
在addDocument()方法中,设置了this.isDocAdd.next(val),但不通知组件更改,subscribe()方法不执行。需要从主题创建一个可观察对象,以便订阅它。使用可观察的
a
isDocAdd: Subject<boolean> = new Subject<boolean>();
onChanged: Observable<boolean> = this.isDocAdd.asObservable();
需要从你的主题中创建一个可观察的对象,以便订阅它。使用可观察的a
isDocAdd: Subject<boolean> = new Subject<boolean>();
onChanged: Observable<boolean> = this.isDocAdd.asObservable();
这是因为组件是在服务之后创建的
这意味着,您的组件不知道您的主题,所以在没有订阅任何内容的情况下调用next
一种解决方案是使用行为主体
:
isDocAdd: BehaviorSubject<boolean> = new BehaviorSubject<boolean>();
isDocAdd:BehaviorSubject=newbehaviorsubject();
它的工作原理完全相同,但是当您实例化它们时,BehaviorSubject
将通知其观察者(即使该值为null,请进行测试!)这是因为您的组件是在服务之后创建的
这意味着,您的组件不知道您的主题,所以在没有订阅任何内容的情况下调用next
一种解决方案是使用行为主体
:
isDocAdd: BehaviorSubject<boolean> = new BehaviorSubject<boolean>();
isDocAdd:BehaviorSubject=newbehaviorsubject();
它的工作原理完全相同,但是当您实例化它的观察者时,BehaviorSubject
会通知它的观察者(即使该值为null,也要进行测试!)这可能是一个长期问题,但我会检查您的服务是否多次实例化(例如,如果它由两个模块提供)。我会在服务的构造函数中植入一个console.log,看看它被调用了多少次。@Amit我在构造函数中使用console.log(),这个服务被调用了2次听起来我可能是对的。检查您是否在多个模块中提供服务?这可能是一个长期的问题,但我会检查您的服务是否多次实例化(例如,如果它由两个模块提供)。我会在服务的构造函数中植入一个console.log,看看它被调用了多少次。@Amit我在构造函数中使用console.log(),这个服务被调用了2次听起来我可能是对的。检查您是否在多个模块中提供服务?still Subscribe()未显示为Notify是否可以使用组件和服务的导入语句编辑问题?still Subscribe()未显示为Notify是否可以使用组件和服务的导入语句编辑问题?。。。什么。请用英文编辑那个评论好吗?我的解决方案到底有什么问题?我改为Behavior Subject,方法中的addDocument()被称为this.docAdd.next(true),但没有订阅任何内容,稍后执行返回响应。仍然是英语,但我想我还是明白了你的意思。你的问题不是这里的主题类型,你的问题是你没有在每一个可能的情况下打电话给下一个。在代码中,在成功回调中测试状态是否为404。但当您收到404时,实际上调用的是您的catch
。您还可以在捕获中返回一个承诺,并在地图中返回一个可观察到的。您的代码一开始是有问题的。。。。什么。请用英文编辑那个评论好吗?我的解决方案到底有什么问题?我改为Behavior Subject,方法中的addDocument()被称为this.docAdd.next(true),但没有订阅任何内容,稍后执行返回响应。仍然是英语,但我想我还是明白了你的意思。你的问题不是这里的主题类型,你的问题是你没有在每一个可能的情况下打电话给下一个。在代码中,在成功回调中测试状态是否为404。但当您收到404时,实际上调用的是您的catch
。您还可以在捕获中返回一个承诺,并在地图中返回一个可观察到的。你的代码一开始是有问题的。
subscription: Subscription;
message;
constructor(private documentService: DocumentService) {
this.subscription = this.documentService.isDocAdd$.subscribe(val => { this.message = val; });
}
isDocAdd: BehaviorSubject<boolean> = new BehaviorSubject<boolean>();