Как написать Angular Чистый код, используя метод подписки? - PullRequest
0 голосов
/ 04 марта 2020

Как написать чистый код в Angular для подписки? Из-за асинхронной природы Angular Typescript, мы должны написать метод processItems() в разных местах кода. Одно местоположение, без предупреждения о диалоговом окне, и местоположение в рамках закрытия подписки диалогового окна.

Есть ли способ централизовать код в одном месте?

В настоящее время:

public validateProductOrder(){
    if (this.product.cost > 1000){
        this.runMaterialDialogBoxWarning();
    }
    else if (this.product.addressType == 'International'){
        this.sendConfirmationEmailCode();
        this.runMaterialDialogBoxWarning();
    }
    else{
        this.processItems();
    }

public processItems(){
   this.processOrderForm();
   this.deliverShipping();
}


runMaterialDialogBoxWarning(){

    materialDialogBoxRef.afterClosed().subscribe(result=> {
        if (data.submit == true){
            this.processItems();   // this is another location we have to write processItems();
        });

Идеальный метод:

public validateProductOrder(){
    if (this.product.cost > 1000){
        this.runMaterialDialogBoxWarning();
        this.processItems();
    }
    else if (this.product.addressType == 'International'){
        this.sendConfirmationEmailCode();
        this.runMaterialDialogBoxWarning();
        this.processItems();

    }
    else{
        this.processItems();
    }

Если идеальный метод невозможен, то это прекрасно, просто любопытно. Выполнение задач с подпиской может затруднить отслеживание элементов.

1 Ответ

1 голос
/ 04 марта 2020

Вы можете попытаться создать наблюдаемое, которое имитирует ответ, возвращаемый диалогом, а затем подписаться на результат в одном месте.

Таким образом, метод processItems будет вызываться только в одном месте. , Вот пример для достижения этого:

import { Observable, of } from 'rxjs';

// rest of the code

public validateProductOrder() {
  let obs: Observable<any>;

  if (this.product.cost > 1000) {
    obs = this.runMaterialDialogBoxWarning();
  } else if (this.product.addressType == 'International') {
    this.sendConfirmationEmailCode();
    obs = this.runMaterialDialogBoxWarning();
  } else {
    // Assign an observable with immediate response here.
    obs = of({submit: true});
  }

  // Subscribe to the observable here.
  obs.subscribe(data => {
    if (data.submit) {
      this.processItems();
    }
  });
}

public processItems() {
  this.processOrderForm();
  this.deliverShipping();
}

runMaterialDialogBoxWarning() {
  return materialDialogBoxRef.afterClosed();
}
...