我坚持使用Rxjs运算符。
这是Angular的后卫canActivate
const ifNoPatientCondition$ = this.dataService.getList().map(pl => {
console.log('im here'); // <<< this message not showing
const found = findOnlyAvailablePatients(pl);
if (found[0] === 1) {
this.stateService.patient.setCurrent(found[1]);
this.dataService.getPatientData(pid);
// return Observable.of(true);
return true;
} else {
if (found[0] === 0) {
this.stateService.app.message.send('Wrong patient status');
} else if (found[0] === -1) {
this.stateService.app.message.send('Wrong patient ID');
}
this.subscribes.forEach(subscribe => subscribe.unsubscribe());
this.stateService.navigate('/patients');
// return Observable.of(false);
// return false;
}
});
const warnOkCondition$ = this.stateService.patient.getCurrent().pipe(mergeMap(pat => {
if (!pat || pat.patient_id !== pid) { // <<< i'm interested with this condition
console.log('there is no patient!', pat); // <<< i see this message
return ifNoPatientCondition$; // <<< but cannot reach this line
} else {
if (pat.status === 'TREATMENT_COMPLETE') {
return Observable.of(false);
}
return Observable.of(true);
}
}));
return warningDialog().pipe(concatMap(warningResult => {
if (!warningResult) { // <<< if clicked No
this.stateService.navigate('/patients');
return Observable.of(false);
} else { // <<< 'Yes'
console.log('you are the best');
return warnOkCondition$;
}
}));
warningDialog()
显示一个对话框并返回可观察的结果。
如果我点击否,则代码正常工作:guard返回false并且路由器导航到/patients
。
否则,如果我点击是,warnOkCondition$
部分正常工作(我对第一个条件感兴趣(console.log
)):我在控制台中看到消息,但不能到达下一行 - ifNoPatientCondition$
代码。
谢谢!
答案 0 :(得分:1)
如果您正在使用Typescript,请使用类型。目前尚不清楚什么是数组,什么是Observable。由于warnOkCondition$
在某些条件下返回Observable.of(true/false)
,我认为this.dataService.getList()
也会返回一个Observable,而不是列表,即使pl
没有$
- 后缀在末尾。在这种情况下,如果您希望执行ifNoPatientCondition$
,则需要订阅{。{1}}。
您可能希望在此处使用switchMap
或mergeMap
。 https://netbasal.com/understanding-mergemap-and-switchmap-in-rxjs-13cf9c57c885