MatDialog Открыть следующий диалог, когда предыдущий был закрыт - для L oop или потока - PullRequest
1 голос
/ 28 февраля 2020

Как открыть следующий диалог из потока, только когда предыдущий был закрыт? Я имею в виду, что я не хочу открывать все диалоги подряд, когда получаю значения потока.

        const arraySource = from(res);

        arraySource.pipe().subscribe(code => {
          console.log('value: ', code);

          const description = this.locale.getDescription(code);
          const config      = new MatDialogConfig();
                config.data = {code: code, description: description.value};

          this.validationDialogRef = this.dialog.open(ValidationDialog, config);
          this.validationDialogRef.afterClosed().subscribe(data => {
                console.log("data returned from mat-dialog-close is ", this.validationDialogRef, data);

          });

        })

Когда я использую оператор take (1), я получаю только первый элемент из Array в диалоге., Без Возьмите (1), все диалоги появятся. Есть какой-то способ запустить Scheluder, когда предыдущий диалог был закрыт>

С уважением

1 Ответ

2 голосов
/ 28 февраля 2020

Вы можете использовать concat. Это вызовет следующую наблюдаемую после завершения предыдущего:

concat(
  ...res.map((code) => of(void 0).pipe(
    concatMap(() => {
      const description = this.locale.getDescription(code);
      const config = new MatDialogConfig();
      config.data = {code: code, description: description.value};

      this.validationDialogRef = this.dialog.open(ValidationDialog, config);

      return this.validationDialogRef.afterClosed().pipe(
        tap((data) => {
          console.log("data from mat-dialog-close:", this.validationDialogRef, data);
        })
      );
    })
  ))
).susbcribe(() => {
  // all dialogs have been processed
});

Если вы хотите использовать concatAll, вы можете сделать это следующим образом. Что в принципе то же самое. Вы также можете использовать его с defer:

from(res).pipe(
  map((code) => defer(() => {
    const description = this.locale.getDescription(code);
    const config = new MatDialogConfig();
    config.data = {code: code, description: description.value};

    this.validationDialogRef = this.dialog.open(ValidationDialog, config);

    return this.validationDialogRef.afterClosed().pipe(
      tap((data) => {
        console.log("data from mat-dialog-close:", this.validationDialogRef, data);
      })
    );
  }),
  concatAll()
).subscribe(() => {
  // all dialogs have been processed
});
...