У меня есть приложение с внешним интерфейсом и приложение с внутренним интерфейсом. Приложение внешнего интерфейса запрашивает у бэкэнда выполнить фоновое задание (например, DELETE /api/v1/object/666
), сервер отвечает с HTTP 202
и дает ссылку на задание (например, https://.../api/v1/job/13
). Теперь приложение внешнего интерфейса должно периодически вызывать эту конечную точку до завершения задания.
Я реализовал это как рекурсивный вызов, это выглядит так:
checkAsyncJob(
jobId: string,
interval: number = 2048,
keepTrying: boolean = true,
onFinish: Function
) {
const jobResult
= this.httpClient.get<Job>(this.urlComposer(JOB_BY_UID, jobId));
jobResult.subscribe((job: Job) => {
if (job.finished === null) {
if (keepTrying) {
// TODO: consider getting rid of recursion, it might should be a loop
new Promise(
resolve => setTimeout(resolve, interval)
).then(
() => this.checkAsyncJob(jobId, interval, keepTrying, onFinish)
);
}
} else {
onFinish();
}
});
}
Я хотел бы избежать рекурсии здесь , поскольку это (я полагаю) заставляет браузер потреблять все больше ОЗУ, пока работа не будет завершена. Есть ли способ переопределить его как al oop, учитывая, что httpClient.get()
возвращает подписываемый объект и основной поток не ожидает его завершения?
Спасибо!