Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript next()don';t通知订阅()_Javascript_Angular_Rxjs - Fatal编程技术网

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>();