Bot框架异步问题

时间:2018-10-29 22:21:24

标签: node.js asynchronous botframework

我正在尝试在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'。”

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

我认为这两种功能的方法中都有许多其他异步线程。我对节点中的工作原理没有很好的了解,但是我猜想响应在错误的位置弹出了堆栈,这就是为什么我没有看到它。事实证明,“无法执行获取”错误有点像是鲱鱼。我从Microsoft的一些正常演示代码中得到了相同的错误。我确定那里应该解决一个单独的问题,但这实际上不是由这个问题引起的。代码正在运行,但是输出丢失了。