解决未决的并行承诺

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,是吗?