javascript - 解决未决的并行 promise

标签 javascript promise hapi.js

我最近将 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/

相关文章:

javascript - 标记不显示在 map api V3 中

javascript - Twitter Bootstrap Carousel,点击点 1 或 2 激活图像,但点击点 3 或 4 没有反应

javascript - 调用者无法使用 ajax 从异步方法中获取正确的值

javascript - HapiJS——以最大内存运行服务器

templates - 使用 hapi 和 Handlebars ,在 hapi 的默认布局支持下,可以从页面中选择替代布局吗?

node.js - Node.js 的 Heroku H12 超时错误

javascript - Object.keys(myObject) 不返回 typescript 中类的属性

javascript - React组件继承使用父方法和子方法

javascript - NodeJS - 无限调用 promise 函数

javascript - onrejected 与 Promise 中的 catch