Вложенные карты Angular2 / Rxjs с условиями в охране - PullRequest
0 голосов
/ 22 мая 2018

Я бы застрял с операторами 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$ код.

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Пожалуйста, используйте Types, если вы работаете с Typescript.Непонятно, что такое массив и что такое Observable.Так как warnOkCondition$ возвращает Observable.of(true/false) при некоторых условиях, я предполагаю, что this.dataService.getList() также возвращает Observable, а не список, даже если pl не имеет $ -суффикса в конце.В этом случае вам нужно подписаться на ifNoPatientCondition$, если вы хотите, чтобы он был выполнен.

Возможно, вы захотите использовать switchMap или mergeMap здесь.https://netbasal.com/understanding-mergemap-and-switchmap-in-rxjs-13cf9c57c885

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...