У меня есть несколько URL, которые содержат информацию.У меня есть идентификатор, который я пытаюсь найти, но не знаю, какой URL содержит нужную мне информацию.Я пытаюсь вызвать каждый URL-адрес и в зависимости от того, что вернет правильный ответ первым, используйте его и отмените другие вызовы.
Я пытался использовать race()
для этого, но столкнулся с проблемой, из-за которой он будетдля завершения возьмите результат из Observable
, даже если этот Observable
не выдал никаких значений (или они были отфильтрованы).Я попытался решить эту проблему, выполнив .concat(never())
для каждого Observable
, но затем кажется, что race()
не отменяет Observables после факта, то есть я не могу использовать их для последующих вызовов.
const urls = ['url1', 'url2', 'url3']
private getItem(id: string): Observable<string> {
return race(
...this.makeUrlCalls(id),
timer(10000).pipe(flatMap(() => of(''))),
)
}
private makeUrlCalls(id: string): Array<Observable<string>> {
return urls.map(url => {
return this.http.get<any>(url + id).pipe(
map(({items: [item]}) => item),
filter(Boolean),
concat(never()),
retry(2),
)
})
}
Я хочу, чтобы всякий раз, когда URL-адрес возвращал результат, первое, которое имеет допустимое значение (непустой массив с именем item), возвращается из вызова race()
.
Любая помощь очень ценится!