Рефакторинг беспорядочной подписки для дальнейшей подписки - PullRequest
0 голосов
/ 26 июня 2019

Я изучаю Angular и наткнулся на Observables, которые мне нравятся и до сих пор не до конца понятны.Итак, у меня есть Observable, которому для завершения требуется завершение Observable.

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

Вот пример моего кода ...

    this.permissionService.build().subscribe( p =>{
        this.Headers = p; 
        this.accessService.buildTitlesWithMenus().subscribe( q => {
          this.treeNodes = this.accessService.buildTreeTable(q); 
        });                 
    });

Ответы [ 2 ]

1 голос
/ 26 июня 2019
this.permissionService.build().pipe(
  tap(p => this.Headers = p),
  switchMap(p => this.accessService.buildTitlesWithMenus()),
).subscribe(q => this.treeNodes = this.accessService.buildTreeTable(q));

Это был бы правильный подход.

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать!

0 голосов
/ 26 июня 2019

Это нормальный способ. И ты все делаешь правильно. Но если вы хотите структурировать свой код. И сделать его более читабельным можно разными способами:

  1. Использование forkJoin метод rxjs

Принимает массив ObservableInput или словарь Объект ObservableInput и возвращает Observable, который испускает либо массив значений в том же порядке, что и переданный массив, или словарь значений в той же форме, что и переданный словарь.

private buildPermissionService() {
    return this.permissionService.build();
}

private buildTitlesWithMenus() {
    return this.accessService.buildTitlesWithMenus();
}

private buildMenuAndPermissions() {
    return forkJoin(
        this.buildPermissionService(),
        this.buildTitlesWithMenus()).subscribe(result => {
        this.Headers = result[0];
        this.treeNodes = this.accessService.buildTreeTable(result[1]);
    });
}
  1. Использование switchMap метод rxjs

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

this.permissionService.build().pipe(
  tap(p => this.Headers = p),
  switchMap(p => this.accessService.buildTitlesWithMenus()),
).subscribe(q => this.treeNodes = this.accessService.buildTreeTable(q));

И другие методы вы можете найти в документации. Например, если вам нужно не только получить результат, но и скомбинировать его, вы можете использовать zip или объединить все .

...