Проблемы с асинхронной структурой бота - PullRequest
0 голосов
/ 30 октября 2018

Я экспериментирую со службой перевода на основе ботов Microsoft. Я написал метод, которому передаю функцию обратного вызова, которая получает мой переведенный текст.

У меня есть существующий бот, который вызывает конечную точку 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, но пользователю ничего не отправляется обратно. Глядя на терминал, я вижу ошибку «Невозможно выполнить« get »для прокси, который был отозван», относящийся к строке context.sendActivity в моем обратном вызове.

Может кто-нибудь подсказать, как сохранить объект контекста активным?

Заранее спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Большое спасибо за помощь всем - я никогда полностью не доходил до сути, но я наконец исправил это с полной переписью кода. Я думаю, что проблема была вызвана большим количеством вложенных синхронных и асинхронных вызовов. Мое окончательное решение состояло в том, чтобы полностью избавиться от всех вложений - сначала вызвать службу перевода (и ждать ее), а затем выполнить исходный вызов.

Я думаю, что есть несколько других асинхронных потоков внутри методов обеих частей функциональности. Я не очень хорошо понимаю, как это работает в узле, но я предполагаю, что ответ получался из стека в неправильной точке, поэтому я его не видел. Оказывается, ошибка «не удалось получить» была чем-то вроде красной сельди. Я получаю ту же ошибку от некоторого рабочего демонстрационного кода Microsoft. Я уверен, что есть отдельная проблема, которая должна быть исправлена, но на самом деле она не была вызвана этой проблемой. Код выполнялся, но вывод терялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...