Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular2/Rxjs nested maps with conditions in guard

I'd stuck with Rxjs operators.

This is a part of Angular's guard 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() shows a dialog and returns observable of result. If i clicked No, code works right: guard returns false and router navigate to /patients.

else if i clicked Yes, warnOkCondition$ works partially right (i'm interesting with first condition (with console.log)): i see message in console, but cannot reach next line - ifNoPatientCondition$ code.

Thanks!

like image 462
n3r0bi0m4n Avatar asked Mar 27 '26 13:03

n3r0bi0m4n


1 Answers

Please use Types if you are working with Typescript. It is not clear what is an array and what is an Observable. Since warnOkCondition$ returns Observable.of(true/false) on some conditions, I assume this.dataService.getList() returns an Observable as well, and not a list, even though pl has no $-suffix at the end. In this case you need to subscribe to ifNoPatientCondition$ if you want it to be executed.

You might want to use switchMap or mergeMap here. https://netbasal.com/understanding-mergemap-and-switchmap-in-rxjs-13cf9c57c885

like image 121
Phil Avatar answered Mar 30 '26 01:03

Phil



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!