【发布时间】:2016-10-16 17:10:56
【问题描述】:
有时你想在多个地方多次使用同一个承诺的对象。例如来自 URL 的 AJAX 资源的承诺。
对象很难缓存,因为你不知道它什么时候异步可用。
没关系,因为您可以call .then() multiple times on a single promise,这样您就可以在第一次需要它时缓存它,并在以后访问缓存。当它可用时,所有的.thens 都会被执行。
但是当 promise 来自 the new fetch API 时,它似乎并不那么简单......因为涉及到第二个 promise。
fetch() 本身会返回一个 promise,当它实现时,您必须使用 .blob() 或 .json() 等方法通过第二个 promise 访问 HTTP 响应的正文。这些是"Body mixin" 的一部分。
如何使用fetch()的香草示例:
fetch(url).then(function(resp) {
return resp.json().then(function(json) {
// use the JSON
});
});
问题在于,即使您可以多次调用.then(),您不能在一个响应中多次调用.blob() 和.json() 等函数。
看来.json() 等的结果也需要缓存,但这应该更困难,因为它只能异步使用。在两个异步承诺解决之前,资源可能会被请求两次 - 竞争条件。
我错过了什么吗?有没有一种简单的方法来缓存 fetch 的 promise 的 JSON 等,而不是我看不到的?我似乎在网上找不到任何地方讨论过这个问题。
【问题讨论】:
-
您是否有理由不能使用变量来存储它?
-
考虑到异步性,何时何地可以访问变量?
-
不清楚你需要在什么范围内使用这个变量。在 fetch 调用之后的 then 块中,您可以在 return 语句上方定义一个变量,并将其分配到所述 return 语句的第一个 then 块中。然后同一个 fetch 块内的后续 return 语句可以访问该变量的内容。但是再一次,您的问题不清楚何时需要访问这些缓存结果。如果超出获取请求和任何后续链接,请指定。
-
好吧,我的真实代码很复杂,涉及至少两个异步 fetch 调用循环来检索值,然后这些值将被过滤并相互交叉引用。这就是为什么我想将值存储在缓存中。当然,可以将缓存对象视为变量。但是一个循环将写入它,另一个循环将从它读取,并且都是异步的。我的问题试图解决一般问题,而不是对我的特定项目进行代码审查(-:
-
我认为,如果您准确地解释了您想要发生的事情,您可能会得到更好的答案。 2个异步获取调用循环?这 2 个循环是否并行运行?过滤和“交叉引用”何时发生?更多细节真的会有所帮助。我现在可以从您的问题中收集到的唯一信息可能是您想使用 Promise.all 并等待两个循环完成,然后同步进行过滤/交叉引用,但是您要完成的再次看起来非常模糊。
标签: javascript caching promise race-condition fetch-api