我最近将 HAPI 安装升级到 v17,它使用了 Promise,并且面临着我不知道如何解决的情况。这不是 HAPI 特定的...
当调用某个路由时,会检查特定服务调用的结果是否已被缓存。如果是这样,我们将跳过调用并使用缓存的结果 - 否则,将进行服务调用,这涉及到 promise 。
问题是,如果服务器启动并且结果尚未缓存,并且我们运行负载测试,突然会出现大量对服务的调用来获取结果,因为它们尚未缓存,然而,一堆请求同时出现。
我想做的只是让第一个请求触发服务调用,然后让所有后续请求等待(通过 promise ?)该调用返回 - 然后可以解决所有待处理的 promise 以让其他请求继续。
我该如何构建它?过去,使用回调时,我只需将回调添加到列表中,然后在结果出现后调用该列表中的所有回调。我可以以某种方式做类似的事情,但堆积 promise 直到调用返回,然后解析商场?我对 Promise 还很陌生,所以很难想象它。
目前,基本的简化逻辑是:
function getData() {
return new Promise(...);
}
...
if (!data) {
data = await getData();
}
return data;
如果数据未缓存,我不想只调用 getData() ,而是想在 getData 发送获取数据的请求时设置一个标志,并让后续调用等待该请求完成以获取数据并继续,而不是而不是发送另一个请求。
谢谢!
最佳答案
您可以缓存 Promise 本身,而不是缓存数据 + flag-to-see-if-data-retrieved。
function loadData() {
someOuterVariable = fetch(...).then(/*transforming data structure*/)
}
async function dataConsumer() {
const data = await someOuterVariable; // does not matter if it has been retrieved or not
....
}
async function anotherConsumer() {
....
const item = (await someOuterVariable).filter(/* just an example of inline processing*/)
}
数据是否已被检索并不重要 - Promise 仍然是 Promise。
唯一的限制是 - 您可以使用新的 Promise 更新 someOuterVariable
,但如果任何消费者函数已经开始 await
- 它将从之前的 Promise 获取旧数据。但根据你的描述,你不应该在 promise 完成之前就替换 promise ,是吗?
关于javascript - 解决未决的并行 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54816620/