【发布时间】:2020-04-22 11:09:48
【问题描述】:
提前为这个模棱两可的标题道歉。
为了更好地解释这个问题 - 我在 fetch-form-data.js 中有两个函数,看起来像......
let cachedBaseUrl;
const getBaseUrl = () => {
if (cachedBaseUrl) return Promise.resolve(cachedBaseUrl)
return fetch('https://some-baseurl-endpoint.com')
.then(baseUrl => {
cachedBaseUrl = baseUrl
return baseUrl
});
}
const getFormData = formId =>
getBaseUrl()
.then(baseUrl => fetch('https://form-data-endpoint.com'))
module.exports = {
getFormData
}
getFormData 被导出并在其他地方循环调用数百次。问题是getFormData 依赖于getBaseUrl,所以调用getFormData 数百次也调用getBaseUrl 数百次,这经常出错,因为我猜baseUrl 端点不喜欢这么快被击中。
我想确保getBaseUrl 只被击中一次,并让所有后续getFormData 对getBaseUrl 的调用“等待”在继续之前解决。
一种解决方案是在使用getFormData 的地方同时导出getBaseUrl 和getFormData,等待getBaseUrl,然后根据需要多次调用getFormData。有点像...
async () => {
const baseUrl = await getBaseUrl();
const formData = [];
for (let form of forms) {
formData.push(getFormData(form));
}
await Promise.all(formData);
...
}
但是,getFormData 的使用分布在整个代码库中。像当前实现一样简单地抽象出getBaseUrl 并只公开getFormData 会很好,但要解决“等待”所有后续getFormData 调用的问题,直到至少第一个getBaseUrl 调用得到解决。
我的微弱尝试是缓存 baseUrl,如上面的代码块所示,但这并不会立即“停止”随后的 getBaseUrl 调用发生,它会调用另一个 fetch,因为尚未缓存任何内容。
我将如何实施这样的事情?
【问题讨论】:
-
在
GetBaseUrl()中缓存Base Url?哦,等等。 -
所以你的问题是你的缓存不起作用,对吧?
-
我的微弱尝试是缓存 baseUrl,如上面的代码块所示,但这并不能“阻止”立即发生后续的 getBaseUrl 调用,因为尚未缓存任何内容,它会调用另一个 fetch。跨度>
-
cachedBaseUrl最终在端点返回 baseUrl 后变为 true,这往往需要 1-2 秒。在这 1-2 秒之前,getBaseUrl已经被调用了数百次,这当然会触发fetch数百次,因为在返回第一个响应之前,cachedBaseUrl仍然是 false -
缓存 Promise 而不是它解析的值。
标签: javascript promise