【问题标题】:Bot framework async issues机器人框架异步问题
【发布时间】:2018-10-29 22:21:24
【问题描述】:

我正在 Microsoft bot 框架上试验翻译服务。我编写了一个方法,我将一个回调函数传递给该方法,该函数接收我的翻译文本。

我有一个现有的机器人,它调用一个 HTTP 端点来创建我的英语输出。我想在将输出返回给用户之前将其翻译成不同的语言。我未更改的代码如下所示:

await request.post(ENDPOINT,
    {
        headers: HEADERS,
        json: BODY
    },
    async function (error, response, body) {
        if (response.statusCode == 202) {
            var msg = body.mainResponse.text;
            context.sendActivity(msg);
        }
    });

这运行得很好。在 HTTP 响应正文中传递的数据被解析后发送回用户。

现在我想插入我的翻译服务。我有一个函数,我调用它来执行此操作,称为Translator.translate(text, callback)。我已将此调用添加到我现有的函数中以获取:

await request.post(ENDPOINT,
    {
        headers: HEADERS,
        json: BODY
    },
    async function (error, response, body) {
        if (response.statusCode == 202) {
            var msg = body.mainResponse.text;
            await Translator.translate(msg, function (output) {
                context.sendActivity(output);
            });
        }
    }
);

我的翻译进程运行并且我在output 变量中获得了翻译,但没有任何东西被发送回给用户。查看终端,我在回调中看到与 context.sendActivity 行相关的错误“无法在已撤销的代理上执行 'get'”。

谁能建议我如何保持上下文对象处于活动状态?

提前致谢。

【问题讨论】:

  • 您使用的是 BotBuilder V3 还是 V4?你所说的微软机器人框架上的翻译服务是指 Azure 中的文本翻译 API 吗?
  • V4,我相信。是的翻译文本 API。我的翻译模块基本上是本教程中代码的变体:docs.microsoft.com/en-us/azure/cognitive-services/translator/…
  • 尝试等待context.sendActivity。它的包含函数当然应该是异步的。
  • 您还需要帮助吗?
  • 谢谢 - 我试过了,我取得了一些进展,但仍然有一些奇怪的问题 - 请参阅下面的评论。

标签: node.js asynchronous botframework


【解决方案1】:

非常感谢大家的帮助 - 我从来没有完全了解这个问题,但我最终通过完全重写代码来修复它。我认为问题是由大量嵌套的同步和异步调用引起的。我的最终解决方案是完全摆脱所有嵌套 - 首先调用翻译服务(并等待它),然后进行原始调用。

我认为这两个功能的方法内部还有许多其他异步线程。我不太了解它在节点中的工作原理,但我猜测响应在错误的点从堆栈中弹出,这就是我没有看到它的原因。事实证明,“无法执行获取”错误有点像红鲱鱼。我从微软的一些工作演示代码中得到了同样的错误。我确信那里有一个单独的问题应该解决,但实际上并不是由这个问题引起的。代码正在运行,但输出丢失了。

【讨论】:

猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2017-04-18
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多