typescript 存储消息、识别消息并轻松返回消息的高效方法

2w3rbyxf  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(112)

我有一个机器人,收到来自X用户的消息后,发送消息的地方,并收到他发送回X用户的响应。X用户可以根据他收到的响应发送另一条消息,机器人将回复第一个响应,并发回第二个响应X用户。我需要有一种方法来存储所有thoses响应到一个ID,并能够回到他们。
先谢谢你了。
我尝试使用一个Map,其中一个键作为ID,而响应作为数组来存储其他的ID,但是我在跟踪该ID时遇到了问题。
下面是一个例子:
Poui to the Bot:“嗨123”
机器人到服务:“一百二十三”
服务机器人:“XXX”(这是第一个回答)
Bot到Poui:“XXX”
机器人对Poui说:“如果你想更多地互动,请在消息的开头写上“{id}”。”
Poui to bot:“{id} U1”
Bot to Service * 对第一回复的响应 *:“U1”
机器人服务:“YYY”(这是第二个响应)
Bot到Poui:“YYY”

tp5buhyn

tp5buhyn1#

几乎可以肯定,你真实的的问题是如何处理异步代码。异步代码有三种策略:
1.回调
1.承诺

  1. async / await
    我假设你知道它们是什么。如果不知道,你可以在很多地方找到它们的解释。例如this blog post。(注意,可能需要一定的尝试和错误才能解释清楚。)
    我将使用JavaScript来完成我的解释,因为我更了解它。但是在JavaScript和typescript之间进行转换相当容易。
    现在的诀窍是,你想要有代码来处理Poui,看起来像这样:
async function processUserInput (..., input, ...) {
    let message = messageFrom(input);
    // will find with an id if one exists, else generates a new ID.
    let serviceCommunicator = serviceCommunicatorFrom(input);
    let response = await serviceCommunicator.request(message);
    sendToUser(response);
    ....
}

好吧,我们刚刚把问题推到了别处,这有什么帮助?
serviceCommunicator是一个具有以下字段的对象。

  1. id对象的id。
  2. fromUser,来自用户的消息数组。
  3. toUser,带有对用户的回复的promise数组。它们被立即添加,但将在它们被解析时被解析。
    1.你觉得有用的都行。
    现在我们可以通过id将所有的服务通信器保存在一个map中,这样我们就可以很容易地返回它们。字面上,如果你传递了一个id,只需查找并返回它。如果没有,用new id构造一个新对象,将其添加到map中,并返回它。
    serviceCommunicator.request(message)是如何工作的呢?我们从下面的例子开始:
function ServiceCommunicator(id):
  const that = this;
  this.id = id;
  this.toUser = [];
  this.fromUser = [];
  this.request = async function (message) {
    that.fromUser.push(message);
    let messagePosition = that.fromUser.length;
    // NO await HERE!!
    let response = that.requestFromService(message);
    that.toUser.push(response);
    let responseMessage = await response;
    return [messagePosition, responseMessage];
  };
  this.requestFromService = async function (message) {
    // do async stuff here
    return responseMessage;
  };
}

现在每个请求都得到了正确的响应,serviceCommunicator知道用户说过的所有事情,哪些已经得到了响应,如果得到了响应,响应是什么。
请注意,内部返回的响应还包括此消息在数组中的位置。如果您实际上想查看逻辑中以前的消息/响应,知道您在该流中的位置可能非常有用。
(Note,使用这种策略,React可能会出现混乱。这是可以修复的,但这种解释已经足够长了。)

相关问题