【发布时间】:2018-03-29 15:02:27
【问题描述】:
我正在与使用一次性身份验证令牌的 API 服务器交谈,每次请求都会重新发布(即生成新令牌)。如果使用同一个令牌同时发出两个 API 请求,一个会由于令牌过期而失败,并且可能会不必要地触发错误处理程序。
我想做的是建立一种等待机制,这样一次只发出一个 HTTP 请求,后续请求排队等待前一个请求完成。
我想以一种通用的方式构建它,这样我就可以有一个服务层来发出请求,因此它对上层是透明的,但是我正在努力寻找一种巧妙的方法来做到这一点。有什么建议吗?
-- edit --
我应该提到,所有后续 API 调用 URL/请求正文都直接依赖于先前 API 调用的响应,例如GET /books?apiKey=ABC 返回:
{
'apiKey': 'XYZ',
'names': [...]
}
排队的下一个请求必须等待此响应并附加新的 apiKey:GET /authors?apiKey=XYZ
在上面的例子中,执行GET /authors?apiKey=ABC 会
导致错误。
如果两个 HTTP 请求之间存在很强的依赖关系(例如请求书,然后根据其 id 请求该特定书的作者),则可以使用 flatMap、嵌套订阅等对它们进行序列化。我需要与此类似的功能,但以一种通用的方式,我可以将请求添加到在运行时序列化的队列中。
-- edit two --
我有两个组件,如下所示,假设它们都在启动时调用 API。
class ComponentA {
ngOnInit(api:<BookApi extends CommonApi>) {
this.api.list().subscribe(x => {...});
}
}
class ComponentB {
ngOnInit(api:<CityLookupApi extends CommonApi>) {
this.api.list().subscribe(x => {...});
}
}
所有 API 服务都扩展了一个通用 API 以隐藏其背后的 apiKey 处理,因此组件可以使用更高级别的调用来帮助理解。问题在于,如果两个组件几乎同时初始化,则两个调用都可以使用相同的 api 密钥,其中一个会失败。但是,我无法使用例如创建这些 Observable 批次。 forkJoin 因为它们是在运行时异步创建和订阅的,因为它们是在各自的组件中创建的。
【问题讨论】: