Angular RxJS: заставить обратные вызовы подписчиков запускаться по порядку - PullRequest
0 голосов
/ 05 октября 2019

Проблема: мне нужно получить конфигурацию и данные с сервера. Данные могут быть обработаны только после того, как конфигурация извлечена и загружена.

Как я хочу, чтобы моя проблема была решена: я хочу получить оба одновременно, используя Angular's HttpClient. Однако обратный вызов для конфигурации должен быть выполнен первым.

Попытка 1: я попытался concat() из этого ТАКого вопроса :

concat(
    this.fetchConfig().pipe(take(1)),
    this.fetchData().pipe(take(1))
).subscribe(val => {
    if (isConfig(val)) {
        // This must be executed before the below populate(val);
        // This one is slow, blocking, so it must be executed
        // as soon as possible.
        load(val);
    } else {
        // val is data
        populate(val);
    }
});

Однако я неЯ думаю, что это достигло моей цели. Я думаю, что Observable - это ленивый исполнитель, он запускается только если есть что-то subscribe(). concat() задерживает подписку обратного вызова на fetchData(), что также задерживает фактическую выборку данных с сервера.

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

Как мне этого добиться? И, кстати, как я могу исправить свой обратный вызов? Имейте некоторый код, чтобы определить, является ли val данными или конфигурация очень уродливой.

Редактировать: я редактирую код для большего пояснения. По сути, я переоценил это. forkJoin() должно быть в порядке для моего случая, так как load(val) довольно быстро. Тем не менее, я все еще хочу подтолкнуть это, заставляя load(val) быть медленным (это на самом деле то, что я думал сегодня утром), поэтому оно должно быть выполнено как можно скорее И до populate(val).

Прямо сейчас я думаю сделать Observable с ним и сделать цепочку.

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Объединение последних будет отправлено после выполнения обоих запросов

combineLatest(
    this.getJConfig(),
    this.fetchData()
).subscribe(([config, data]) => {
  // Use config
  // Then use data
});

Нет необходимости делать один запрос http, поскольку наблюдаемое завершается после завершения запроса.

Нетвам нужно беспокоиться об использовании config, как только он завершится, поскольку количество времени, которое требуется JavaScript для обработки ответа, незначительно по сравнению с количеством времени, которое требуется для выполнения запроса.

Если вы действительно хотите сохранитьПриказ, который я недавно придумал для этого извилистого зверя для кого-то другого RxJS: MergeMap с сохранением порядка ввода

0 голосов
/ 05 октября 2019

Может быть, не идеальный RxJS, но вы могли бы сделать ...

const configFetch = this.fetchConfig().toPromise();
const dataFetch = this.fetchData().toPromise();
const config = await configFetch;
processConfig(config);
const data = await dataFetch;
processData(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...