Работая над диалоговым компонентом с angular js, и теперь я обнаружил, что моя функция подписана и в условии if не завершает метод, а постоянно выполняет другую функцию afterClosed(), вот пример кода:

openCreateNewContentDialog(): void {
    const oldData = this.dataSource.data;
    const dialogConfig = AppConstants.matDialogConfig();
    const dialog = this.dialog.open(LicenseDialogComponent, dialogConfig);

    dialog.beforeClosed().subscribe(licenceDate => {
      for (const datesToCheck of oldData) {
        const newDateFrom = new Date(licenceDate.expirationDateFrom);
        const oldDateTo = new Date(datesToCheck.expirationDateTo.toString());
        if (newDateFrom <= oldDateTo) {
          // console.log('return?');
          return;
        }
      }
    });

    dialog.afterClosed().subscribe(licence => {
      if (licence) {
        this._value.push(licence);
        this.dataSource.data = this.value;
        this.change();
      }
    });
  }

Каков наилучший и оптимизированный способ отказаться от подписки на функцию beforeClosed()?

0
BinaryTie 30 Июн 2020 в 11:02

1 ответ

Лучший ответ

Итак, из вашего описания я понимаю, что вы не t want a second subscription to happen if the condition in the first subscriber is true, right? But you subscription will happen anyway because you instantiated it in the method, the code in the subscribe() it's just a callback. So if you don не хотите много переписывать, я предлагаю сохранить подписки в переменных, поэтому вы будете иметь к ним доступ и можете отказаться от подписки в любой момент.

openCreateNewContentDialog(): void {
const oldData = this.dataSource.data;
const dialogConfig = AppConstants.matDialogConfig();
const dialog = this.dialog.open(LicenseDialogComponent, dialogConfig);

const beforeClosed = dialog.beforeClosed().subscribe(licenceDate => {
  for (const datesToCheck of oldData) {
    const newDateFrom = new Date(licenceDate.expirationDateFrom);
    const oldDateTo = new Date(datesToCheck.expirationDateTo.toString());
    if (newDateFrom <= oldDateTo) {
      // console.log('return?');
      afterClosed.unsubscribe();
      return;
    }
  }
});

const afterClosed = dialog.afterClosed().subscribe(licence => {
  if (licence) {
    this._value.push(licence);
    this.dataSource.data = this.value;
    this.change();
  }
});

}

Я надеюсь, что это помогает! Также вы можете попробовать https://www.digitalocean.com/community/ tutorials / angular-takeuntil-rxjs-unsubscribe, если вам нужно обрабатывать несколько подписок.

0
Yura Rudnychenko 30 Июн 2020 в 08:47