如何在处理 HTTP 请求时使用等待,其中 Promise 被解析为另一个 HTTP 请求

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

我正在开发一款基于网络的游戏,玩家可以选择一种操作类型,然后选择一个执行该操作的空间。我不是先编写 Web 基础设施(我计划使用express.js),而是先编写操作,看看是否可以创建一个漂亮干净的界面。

例如,玩家通过请求选择“树木”,当玩家选择树木时发生的代码是

  async play(): Promise<void> {
    const hex = await game.ask<Hex>(new SelectHex());
    game.placeToken(hex, "greenery");
  }

我理解这可能是多么落后,因为

game.ask
现在(最终)负责编写 HTTP 响应,同时还拥有
Promise
。我避免尝试写一些不太优雅的东西,比如

  async play() {
    return new SelectHex((hex) => game.placeToken(hex, "greenery"));
  }

这里看起来不那么不优雅,但可能更复杂。

理想情况下,接收十六进制的 Express 端点需要访问

Promise
,以便调用其
resolve
方法。

这种模式可行吗?我意识到可能需要更多信息,但我不确定还要写什么。

javascript node.js express async-await
1个回答
0
投票

如果我理解正确的话:

您正在考虑的模式(在服务器端代码中使用 async/await 来处理跨越多个 HTTP 请求的用户交互)在像 Express.js 这样的无状态 Web 架构的上下文中是不可行的。服务器无法跨多个请求维护执行上下文(如待处理的 Promise),它们是完全独立的。

当你写下:

async play(): Promise<void> {
  const hex = await game.ask<Hex>(new SelectHex());
  game.placeToken(hex, "greenery");
}

您实际上是在尝试暂停服务器端函数 play() ,直到用户选择十六进制,这涉及来自客户端的新 HTTP 请求。但是,服务器无法在多个 HTTP 请求中保持函数执行挂起,因为一旦初始请求完成,执行上下文就会丢失。

因此,为了让您做您想做的事情,您需要在服务器上创建一个状态:无论是状态机、会话还是其他什么。

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