Angular2 / Rxjs嵌套地图,其条件为guard

时间:2018-05-22 15:55:08

标签: javascript angular typescript rxjs

我坚持使用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 :(得分:1)

如果您正在使用Typescript,请使用类型。目前尚不清楚什么是数组,什么是Observable。由于warnOkCondition$在某些条件下返回Observable.of(true/false),我认为this.dataService.getList()也会返回一个Observable,而不是列表,即使pl没有$ - 后缀在末尾。在这种情况下,如果您希望执行ifNoPatientCondition$,则需要订阅{。{1}}。

您可能希望在此处使用switchMapmergeMaphttps://netbasal.com/understanding-mergemap-and-switchmap-in-rxjs-13cf9c57c885