【发布时间】:2022-01-17 09:28:24
【问题描述】:
我有一个 SPA,由于技术原因,我有不同的元素可能会同时触发相同的 fetch() 调用。[1]
与其疯狂地试图阻止多个不相关的元素来协调元素的加载,我正在考虑创建一个 gloabalFetch() 调用,其中:
-
init参数被序列化(与resource参数一起)并用作哈希 - 发出请求时,将其排队并存储其哈希
- 当另一个请求到来并且哈希匹配(这意味着它正在运行)时,将不会发出另一个请求,它会从前一个请求返回
async function globalFetch(resource, init) {
const sigObject = { ...init, resource }
const sig = JSON.stringify(sigObject)
// If it's already happening, return that one
if (globalFetch.inFlight[sig]) {
// NOTE: I know I don't yet have sig.timeStamp, this is just to show
// the logic
if (Date.now - sig.timeStamp < 1000 * 5) {
return globalFetch.inFlight[sig]
} else {
delete globalFetch.inFlight[sig]
}
const ret = globalFetch.inFlight[sig] = fetch(resource, init)
return ret
}
globalFetch.inFlight = {}
显然缺少获取请求时间戳的方法。另外,它缺少批量删除旧请求的方法。除此之外......这是一个好方法吗?
或者,是否已经有一些东西,我正在重新发明轮子......?
[1] 如果您好奇,我有几个位置感知元素,它们将根据 URL 独立重新加载数据。这一切都很好并且解耦了,只是它有点……太解耦了。需要相同数据的嵌套元素(具有部分匹配的 URL)最终可能会同时发出相同的请求。
【问题讨论】:
-
如果是GET请求,浏览器会自动缓存。
-
...?只有在服务器允许的情况下,API 请求才不会发生...
-
“API 请求不会发生”你的意思是 POST 请求?否则,是的,听起来您正在重新发明Cache API,不同之处在于您需要处理甚至在响应可用之前提出新请求的情况,这可以通过在尝试之前等待上一个请求结束来完成开始一个新的:jsfiddle.net/852tzcjd 但是只有 GET 请求是可缓存的。
-
你错过了最重要的用例——我可以请求
/something,然后是/somethingElse,然后又是/something。使用 caches 对象可能是个好主意,但是您提出的实现将不起作用
标签: javascript async-await promise fetch