gpt4 book ai didi

angular - 我如何处理 RxJS 中相互传递数据的子顺序 URL 调用?

转载 作者:太空狗 更新时间:2023-10-29 18:35:26 29 4
gpt4 key购买 nike

我有一个服务调用,如果服务器忙于处理响应,它可能会返回给我一个队列 URL。

我正在编写一个 Angular 服务来处理这些类型的调用,我正在努力弄清楚什么样的 RXJS 6+接线员帮我处理这件事。

这意味着我想做一个回退,如果响应返回给我一个排队的 URL,我将订阅这个调用,并重试直到我得到答案。

等待时间最长可达 30 秒 ( < insert frustrations here> )。

从 rxjs 文档页面可以看出,我需要使用 concatMap运算符,以某种方式retry直到我得到正确的回应?也许有一些delay运营商限制通话量?

我找到了这个 snippet来自 https://www.learnrxjs.io/ .

提前致谢!

最佳答案

这是一个递归调用结构,所以你需要写一个递归的observable。您没有提供确切的响应结构,所以我无法给出确切的代码,但在较高级别上它看起来像这样:

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
);
}

关于angular - 我如何处理 RxJS 中相互传递数据的子顺序 URL 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55950670/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com