Below is my angular function
observeDiaryCreate(){
this.diarySub = this.diaryService.diaryTrigger$.subscribe((dataVal: boolean) => {
if(dataVal) {
if(this.isEdit && this.statusId != 1) {
this.baseService.checkFeature('setFeature').subscribe((response: any) => {
if(!response) {
if((JSON.stringify(data1) !== JSON.stringify(data2))) {
this.modafRef = this.modalService.show();
return;
}
}
},
error => {},
() => {});
}
this.validateDiary();
} else {
this.onCancel();
}
})
}
Here, I want to execute this.validateDiary()
method, only after the inner subscribe gets executed. I am trying to stop the code execution by using return
statement when a specific condition is met. But what is now happening is, both return
and this.validateDiary()
are being executed and first this.validateDiary()
is being called even before the subscribe. How can I format my code to meet my criteria. Any help would be great. Thanks in advance.
CodePudding user response:
The reason your this.validateDiary()
gets executed is because once the outer observable emits, you are subscribing to inner observable as well as calling the function, this.validateDiary()
. If you need to call this.validateDiary()
only when the inner observable emits, then you can do following.
observeDiaryCreate() {
this.diarySub = this.diaryService.diaryTrigger$
.pipe(
filter(dataVal => dataVal && this.isEdit && this.statusId != 1), // a filter to match the condition
switchMap(() => this.baseService.checkFeature('setFeature')) // mapped to second observable.
)
.subscribe(response => {
if (!response) {
if ((JSON.stringify(data1) !== JSON.stringify(data2))) {
this.modafRef = this.modalService.show();
this.validateDiary();
}
}
}, error => {});
}
CodePudding user response:
Why don't you add it at Location 1 or Location 2.
this.baseService.checkFeature('setFeature').subscribe((response: any) => {
//Location 1
if(!response) {
if((JSON.stringify(data1) !== JSON.stringify(data2))) {
this.modafRef = this.modalService.show();
return;
}
}
},
error => {},
() => {
//Location 2
});
CodePudding user response:
"I dont want it to be executed inside if(this.isEdit && this.statusId != 1)"
As per this comment I guess you want to run this.validateDiary(); relardless of the condition. But still you want subscription within to complete before calling this.validateDiary()
Just a simple hack. If you closely look
if this.isEdit && this.statusId != 1 is true then this.validateDiary(); within the subscription will be called. Also this.validateDiary(); will be called after the sunscription completion
if this.isEdit && this.statusId != 1 is false then this.validateDiary(); within the else condition will be called
observeDiaryCreate(){
this.diarySub = this.diaryService.diaryTrigger$.subscribe((dataVal: boolean) => {
if(dataVal) {
if(this.isEdit && this.statusId != 1) {
this.baseService.checkFeature('setFeature').subscribe((response: any) => {
if(!response) {
if((JSON.stringify(data1) !== JSON.stringify(data2))) {
this.modafRef = this.modalService.show();
}
}
this.validateDiary();
},
error => {},
() => {});
} else {
this.validateDiary();
}
} else {
this.onCancel();
}
})
}