У меня есть следующий сценарий: Я запускаю HTTP-запрос (используя Observables). Теперь, во время этого HTTP-запроса, я хочу запустить еще два запроса в качестве побочного эффекта. Последние два запроса зависят от первого запроса (они должны запускаться только после успешного выполнения первого запроса). Кроме того, меня не волнует, когда вернутся эти два запроса, они должны просто работать в фоновом режиме.
Я придумал следующий код:
performRequests(): Observable<any> {
const firstRequestUrl = 'https://api.example.com/firstRequest';
const secondRequestUrl = 'https://api.example.com/secondRequest';
const thirdRequestUrl = 'https://api.example.com/thirdRequest';
return this.http.get(firstRequestUrl).pipe(
tap(() => {
// The following requests will run in the background without
// affecting the output of the main request.
this.http.get(secondRequestUrl).subscribe();
this.http.get(thirdRequestUrl).subscribe();
}),
);
}
Это работает. Однако, насколько я знаю, это анти-шаблон для запуска запросов в качестве побочного эффекта в операторе pipe(). Нам лучше их как-то связать. Но concat() или merge() не помогут, потому что они ждут, пока все запросы вернутся.
Итак, мой вопрос:
Хорошая точка зрения. Но я неправильно написал в теме. На самом деле два других запроса следует вызывать только в случае успешного выполнения первого, поэтому они не являются полностью независимыми. Я изменил это в теме выше.
Вам понадобится switchMap:
of(1).pipe(
switchMap(response1 =>
forkJoin([of(2), of(3)])
.pipe(map((result) => ({ first: response1, second: result[0], third: result[1] })))))
.subscribe((e) => console.info(e));
просто замените of(1), of(2), of(3) вашими наблюдаемыми. Кроме того, подписка на наблюдаемое является антипаттерном.
Да, именно так я это реализовал сейчас. Хорошее решение, спасибо!
Если вас не волнуют результаты этих запросов, почему бы просто не поместить 2 строки кода перед оператором
return
?