Существует ли стандарт RXJS для создания / обработки потоков HTTP? - PullRequest
0 голосов
/ 20 марта 2019

Проще говоря, я постоянно сталкиваюсь с препятствиями с помощью RXJS, потому что почти каждый пример опирается на постоянный поток данных, тогда как я делаю HTTP-запросы, которые имеют единственную природу.

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

Проблема, как я уверен, вы знаете, заключается в том, что подписки HTTP прекращаются сразу же после завершения и «подключение» запускает его немедленно.Это концепция RXJS, которую я все еще пытаюсь обернуть вокруг себя.

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

myBehaviorSubject = new BehaviorSubject<Result>(null);
myBehaviorSubject$ = myBehaviorSubject.asObservable()
...
getData(params): Observable<Result[]> {
      const http$ = this.httpClient
        .get('blah', {params})
        .pipe(map(response => response as Result[]));

      http$.subscribe(result: Result => {
         myBehaviorSubject.next(result);
      });

      return myBehaviorSubject$;
    }

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

Действительно ли внутренние подписки - способ сделать это?Существуют ли способы заставить потребителей ждать HTTP-запросов, не делая избыточных вызовов на сервер?

Может кто-нибудь пролить свет на этот вопрос?

1 Ответ

0 голосов
/ 20 марта 2019

Я иду против нормы с http-запросами.Они не являются для меня потоками.

async getData(params): Promise<Result[]> {
    return this.httpClient
        .get('blah', {params})
        .toPromise();       
}

Или:

async loadComplexViewModelData(params): Promise<{[dataA, dataB, dataC]}> {    
  [dataA, dataB, dataC] = await Promise.all([
    this.httpClient
      .get('blahA', {params})
      .toPromise();
    this.httpClient
      .get('blahB', {params})
       .toPromise();
    this.httpClient
      .get('blahC', {params})
      .toPromise();
  ]);      
}

Выше не включает обработку ошибок или вложенность. Может быть, запрос blahB возвращает ключи, которые вам нужнывыборки.Добавить оператор then() к toPromise().

Это альтернатива, которая противоречит популярному шаблону и не дает конкретного ответа на поставленный вопрос.

Вот как я решил «Эточувствует себя ... неправильно "Делима у меня тоже.Я не думаю, что rxjs - правильный инструмент для работы, и я в меньшинстве:)

...