在子订阅中返回父可观察对象

时间:2017-06-14 01:18:13

标签: angular typescript rxjs

我试图在另一个可观察的订阅中尝试return布尔值。但是,我无法让return冒泡到父方法。

我意识到我return在订阅的上下文中,但我如何告诉canDeactive dialog.result.subscibe订阅已完成并且能够返回布尔值?

  canDeactivate(): Observable<boolean> | Promise<boolean> | boolean {
    const settings: DialogSettings = {
      title: 'Please confirm',
      content: 'Are you sure want to leave without saving your changes?',
      actions: [
        { text: 'No'},
        { text: 'Yes', primary: true }
      ]
    };

    if (!this.isSaved && this.updatedPositions.length) {
      // return confirm('Do you want to discard the changes?');



      const dialog: DialogRef = this.dialogService.open(settings);

      dialog.result.subscribe((result: DialogResult) => {

        if (!(result instanceof DialogCloseResult) && result['text'] === 'Yes') {
          console.log('action', result);
          console.log('returning false');
          return false;

        } else {
          console.log('dialog.close()');
          dialog.close();
          return true;
        }

      })

    } else {
      console.log('else');
      return true;
    }

  }

1 个答案:

答案 0 :(得分:2)

dialog.result是一个异步调用。它类似于从回调返回,显然无法反映到main方法。实际上,您在true部分通话中没有返回任何内容。

不要订阅更改,按原样返回可观察的。使用map转换数据。

return dialog.result.map((result: DialogResult) => {

    if (!(result instanceof DialogCloseResult) && result['text'] === 'Yes') {
      console.log('action', result);
      console.log('returning false');
      return false;

    } else {
      console.log('dialog.close()');
      dialog.close();
      return true;
    }

  })

并保持一致,在其他主要方面,最底层。返回一个Observable。

} else {
  console.log('else');
  return Observable.of(true);
}