解决未决的并行承诺
Resolving pending parallel promises
我最近将一个 HAPI 安装升级到 v17,它使用了 promises,我面临一个我不知道如何解决的情况。这不是特定于 HAPI 的...
当调用某个路由时,会检查是否已缓存特定服务调用的结果。如果是这样,我们将跳过调用并使用缓存的结果 - 否则,将进行服务调用,这涉及到承诺。
问题是,如果服务器已启动但结果尚未缓存,而我们 运行 进行负载测试,突然就会大量调用服务以获取结果,因为它们还没有缓存,一堆请求同时进来。
我想做的是只让第一个请求触发服务调用,然后让所有后续请求等待(通过承诺?)对 return 的调用 - 然后所有未决的承诺都可以决定让其他请求继续。
我该如何构造它?过去,使用回调,我只是将回调添加到列表中,然后在结果出现后调用该列表中的所有回调。我能以某种方式做类似的事情吗,但在调用返回之前叠加承诺,然后解决商场?我对 promises 还是个新手,所以很难想象它。
目前基本的简化逻辑是:
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 更新 someOuterVariable
,但如果任何消费者功能已经开始 await
- 它将从以前的 Promise 获取旧数据。但是根据您的描述,您不应该在 promise 实现之前替换 promise,是吗?
我最近将一个 HAPI 安装升级到 v17,它使用了 promises,我面临一个我不知道如何解决的情况。这不是特定于 HAPI 的...
当调用某个路由时,会检查是否已缓存特定服务调用的结果。如果是这样,我们将跳过调用并使用缓存的结果 - 否则,将进行服务调用,这涉及到承诺。
问题是,如果服务器已启动但结果尚未缓存,而我们 运行 进行负载测试,突然就会大量调用服务以获取结果,因为它们还没有缓存,一堆请求同时进来。
我想做的是只让第一个请求触发服务调用,然后让所有后续请求等待(通过承诺?)对 return 的调用 - 然后所有未决的承诺都可以决定让其他请求继续。
我该如何构造它?过去,使用回调,我只是将回调添加到列表中,然后在结果出现后调用该列表中的所有回调。我能以某种方式做类似的事情吗,但在调用返回之前叠加承诺,然后解决商场?我对 promises 还是个新手,所以很难想象它。
目前基本的简化逻辑是:
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 更新 someOuterVariable
,但如果任何消费者功能已经开始 await
- 它将从以前的 Promise 获取旧数据。但是根据您的描述,您不应该在 promise 实现之前替换 promise,是吗?