解决未决的并行承诺

时间:2019-02-21 21:37:28

标签: javascript promise hapijs

我最近将HAPI安装升级到了使用Promise的v17,并且遇到了一种我不知道如何解决的情况。这不是特定于HAPI的...

当调用某个路由时,将进行检查以查看特定服务调用的结果是否已被缓存。如果是这样,我们将跳过呼叫并使用缓存的结果-否则,将进行涉及承诺的服务呼叫。

问题是,如果服务器已启动并且尚未缓存结果,并且我们运行了负载测试,突然会有大量的服务调用以获取结果,因为尚未缓存结果,但是,同时发出了许多请求。

我想做的就是只让第一个请求触发服务调用,然后让所有后续请求(通过承诺)等待该调用返回-然后可以解析所有待处理的promise以让其他请求继续。

该如何构造?过去,使用回调,我只会将回调添加到列表中,然后在结果输入后调用该列表中的所有回调。我能以某种方式做些类似的事情,但是将promise堆积起来直到调用返回,然后再解决商场?我对诺言仍然陌生,因此很难形象化它。

目前存在的基本简化逻辑是:

function getData() {
    return new Promise(...);
}

...

if (!data) {
    data = await getData();
}
return data;

我不只是在未缓存数据时调用getData(),我还想在getData发送请求获取它时设置一个标志,并让后续调用等待该请求完成以获取数据并继续前进,而不是发送另一个请求。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以缓存Promise本身,而不是缓存数据+检索到的数据标记。

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获取旧数据。但是根据您的描述,在兑现诺言之前,不是您的情况下替代诺言吗?