如何在机器人框架中的两条消息之间产生延迟 - Node.js



我正在开发一个机器人,该机器人使用botbuilder JS V4使用Direct Line连接到我们的客户端应用程序。 由于某些原因,消息以错误的顺序发送到机器人。例如:

  • 用户:您好

  • 机器人:我能帮你什么?

  • 机器人:嗨,我是机器人。

作为解决方案,我在机器人的许多对话中在消息之间添加了两秒钟的延迟。

正确的方法是什么?这是解决此问题的推荐方法吗?

使用 setTimeout((

async greetUser(step) {
...
await step.context.sendActivity(firstReply);
setTimeout(() => {
await step.context.sendActivity(secondReply);
}, 2000);
}

使用 sleep((

const sleep = require("util").promisify(setTimeout);
async greetUser(step) {
...
await step.context.sendActivity(firstReply);
await sleep(2000);
await step.context.sendActivity(secondReply);
}

添加许多 sleep(( 函数后,我注意到机器人性能受到影响。机器人在生产环境中没有响应。它包含此错误:

[onTurnErrorStack]: Error
at new RestError (D:homesitewwwrootnode_modules@azurems-rest-jsdistmsRest.node.js:1397:28)
at D:homesitewwwrootnode_modules@azurems-rest-jsdistmsRest.node.js:1849:37
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
[onTurnError]: {"statusCode":401,"request":{"streamResponseBody":false,"url":"https://directline.botframework.com/v3/conversations/DxjYZQsdv16sdULAsaIn8iQ-h/activities/DxjYZQ65dffgsaIn8iQ-h%7C0000000","method":"POST","headers":{"_

有什么建议可以解决这个问题吗?

如果您使用的是默认BotFrameworkAdapter,您也可以使用delayActivityType。这将增加延迟,而无需额外的代码(源(。

您也可以尝试sendActivities方法,根据文档,这也将保持顺序。活动将按接收顺序依次发送。将为每个已发送的活动返回一个响应对象。对于message活动,这将包含已传递消息的 ID。

async greetUser(step) {
await step.context.sendActivities([
{ type: 'message', text: 'First reply' },
{ type: 'delay', value: 2000 },
{ type: 'message', text: 'Second reply' }
]);
}

我遇到了类似的问题,我正在记录成绩单,响应会覆盖请求。我找到了一个简单的 for 循环,它允许我设置 ms 延迟,它对我来说效果很好。等待函数为:

async wait(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds) {
break;
}
}
}

所以你应该可以这样称呼它:

async greetUser(step) {
...
await step.context.sendActivity(firstReply);
await this.wait(2000);
await step.context.sendActivity(secondReply);
}

现在这似乎与睡眠功能非常相似,我没有任何经验。我没有遇到任何问题,并且每轮调用两次以记录请求和响应,尽管我的延迟只有 250 毫秒,而不是 2000 毫秒。

我很想知道是否有更好的方法来引入对话延迟。

编辑:如下面的评论所述,等待承诺将是一个更好的解决方案。但是将原始答案留在这里,以防对某人有益。在异步功能中,似乎await new Promise(resolve => setTimeout(resolve,2000));可以提供相同的结果而没有缺点。

最新更新