Хорошая практика для передачи таких функций? - PullRequest
0 голосов
/ 23 января 2019

У меня следующий сценарий, в котором я подписываюсь в Компоненте A на Субъекта (service.save) и хочу вызвать некоторые функции Компонента B, C, D, E до того, как это событие пройдет.Я думал о чем-то вроде этого:

//Component A only one subscribing
this.service.save.subscribe((event)=>{
    this.sharedService.beforeSaveFunctions.forEach(fn => {
        fn(event);
    });
    // ... do something
});


@Injectable()
export class SharedService{
  beforeSaveFunctions: any[];

  registerBeforeSaveFunction(fn:any){
      this.beforeSaveFunctions.push(fn);
  }
}


//Component B, C, D, ...
ngOnInit(): void {
    this.sharedService.registerBeforeSaveFunction(handleSave.bind(this));
}

handleSave(event){
    //Do something..
}

Таким образом, каждый компонент может вызвать this.sharedService.registerBeforeSaveFunction(), чтобы передать свою собственную функцию, которая впоследствии будет выполнена при подписке в Компоненте А.

Это хорошо?стиль?У меня нет доступа к службе, которая содержит save Subject, так как это внешняя библиотека.Если я подписываюсь на него в каждом компоненте, и каждый компонент делает свое дело, он становится грязным, и у меня возникают проблемы с асинхронностью, когда одна подписка завершается раньше другой.

1 Ответ

0 голосов
/ 23 января 2019

Я бы, возможно, обернул службу внешней библиотеки внутри "SharedService" и выставил бы "Save" Observable как член SharedService следующим образом:

// Component A only one subscribing
this.sharedService.save.subscribe((event) => {
    // ... do something
});

@Injectable()
export class SharedService {
    save = this.service.save
        .pipe(
            tap(event => this.beforeSaveFunctions.forEach(fn => fn(event)))
        );

    constructor(private service: Service) { }

    beforeSaveFunctions: any[];

    registerBeforeSaveFunction(fn: any) {
        this.beforeSaveFunctions.push(fn);
    }
}

//Component B, C, D, ...
ngOnInit(): void {
    this.sharedService.registerBeforeSaveFunction(handleSave.bind(this));
}

handleSave(event){
    //Do something..
}
...