Это рекурсивная структура вызовов, поэтому вам нужно написать рекурсивную наблюдаемую.Вы не предоставили точные структуры ответа, поэтому я не могу дать точный код, но на высоком уровне это будет выглядеть так:
getQueuedResponse<T>(url) {
return this.http.get<T>(url).pipe( // fetch the first URL
switchMap(res =>
(res.queueUrl) // if queued (your actual queue indicator may be different)
? this.getQueuedResponse<T>(res.queueUrl) //then recurse (your actual next url may be different or it may be the original url again)
: of(res))); // else break (what you actually return here may be different)
}
вы можете добавить задержку, если хотите, с помощью простоготаймер:
getQueuedResponse<T>(url) {
return this.http.get<T>(url).pipe( // fetch the first URL
switchMap(res =>
(res.queueUrl) // if queued, recurse after 5 seconds
? timer(5000).pipe(switchMap(t => this.getQueuedResponse<T>(res.queueUrl))
: of(res))); // else break
}
В качестве альтернативы, если ваши потребности немного отличаются и вы можете просто вызывать один и тот же URL-адрес снова и снова, вы можете увидеть, что это проблема опроса:
pollForResponse<T>(url) {
return timer(0, 5000).pipe( // start right away then emit every 5 seconds
switchMap(i => this.http.get<T>(url)), // request the URL
takeWhile(r => !!r.queued), // keep taking while it's queued
last() // only emit the last response
);
}