JavaScript Web 服务器:了解请求处理期间的阻塞行为

问题描述 投票:0回答:1

我有一个 Web 服务器需要从一个缓慢的 api 中获取和缓存大约 1000 个项目。

我希望第一个请求和任何遇到 ttl 过期的请求都能启动此操作,但随后会继续请求。它有其他要返回的值,并且可以为即将刷新的数据提供陈旧或空值。

我重新创建了一个简化的例子:

// ... within some handleRequest function
if (
  !cache.isFetching && 
  (!cache.isSet || cache.isStale)
) {
  // start fetch/cache, but don't block
  fetchAndCacheThatStuff();
}
// ... continue with request handling

我正在尝试推理在缓存刷新期间请求进入时如何/何时阻塞:

async function fetchAndCacheThatStuff() {
  cache.isFetching = true;
  for (const twoHundoIds of chunk(oneThousandIds, 200) {
    const result = await fetchItems(twoHundoIds);
    await cache.mset(result.map(mapResultToCacheEntries));
  }
  cache.isSet = true;
  cache.isStale = false;
}

是否存在服务器等待响应而无法处理另一个传入请求的时间?

javascript asynchronous caching async-await event-loop
1个回答
0
投票

异步函数

fetchAndCacheStuff
在等待响应时不会阻塞

来自 Node.js 设计模式 第 5 章:具有 Promises 和 Async/Await 的异步控制流模式

在每个

await
表达式中,函数的执行被暂停,它的状态被保存,并且控制返回到事件循环。一旦等待的
Promise
解决,控制权将返回给异步函数,返回
Promise
的实现值。

© www.soinside.com 2019 - 2024. All rights reserved.