有效地存储消息、对其进行标识并轻松地返回消息



我有一个机器人,在收到X用户的消息后,在某处发送消息并接收他发送回X用户的响应。然后,X用户可以根据他收到的响应发送另一条消息,bot将回复第一个响应并将第二个响应发送给X用户。我需要有一种方法来存储所有这些响应到一个ID,并能够返回到他们。

提前感谢。

我尝试使用一个键作为ID的映射和响应作为数组来存储其他的,但我有问题保持跟踪该ID。var messageWaiting = new Map<any,[any,any,&quot;&quot;]>()

下面是一个例子:

给机器人留言:"嗨,123">

转到服务:"123">

给机器人的服务:"(这是第一次响应)

Bot to Poui: "XXX">

Bot to Poui:"如果你想要更多的互动,在你的消息开始">

对bot: "{id} U1">

Bot to Service对第一个回复的响应:"U1">

服务到Bot: "YYY'(这是第二个响应)

Bot to Poui: "YYY">

几乎可以肯定,您真正的问题是如何处理异步代码。异步代码有三种策略:

回调
  1. async/await

我假设你知道它们是什么。如果没有,你可以在很多地方找到解释。比如这篇博文。(注意,可能需要一定数量的试验和错误才能使解释有意义。)

我将使用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,包含对用户的回复的承诺数组。它们会被立即添加,但会在它们被解析时被解析。

现在我们可以通过id将所有服务通信器保存在地图中,使我们可以轻松地返回它们。从字面上讲,如果你传递了一个id,只需查找并返回它。如果没有,则构造一个具有新id的新对象,将其添加到映射中,并返回该对象。

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知道用户所说的所有内容,哪些已被响应,如果被响应,则响应是什么。

注意,内部返回的响应还包括该消息在数组中的位置。如果你真的想在你的逻辑中查看以前的消息/响应,知道你在流中的位置可能会很有帮助。

(注意,此策略的响应顺序可能不一致。这是可以解决的,但是这个解释已经足够长了。

最新更新