Проблема: мне нужно получить конфигурацию и данные с сервера. Данные могут быть обработаны только после того, как конфигурация извлечена и загружена.
Как я хочу, чтобы моя проблема была решена: я хочу получить оба одновременно, используя 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 с ним и сделать цепочку.