Необходим аналог 'До цикла' - чтобы продолжить диалог бота - после обновления статуса 'маркер' - PullRequest
0 голосов
/ 19 февраля 2019

Аналогу «До цикла» требуется непрерывное чтение переменной состояния из вспомогательной функции - и затем (когда переменная состояния «как нам нужно») - для возобновления потока разговоров бота.

В моем боте (botbuilder v.3.15) Я сделал следующее:

  1. Во время одного из моих диалогов мне нужно было открыть внешний URL, чтобы собрать некоторую информацию от пользователя через этот URL.
  2. После этого я отправил собранные данные (с идентификатором разговора и другой информацией) с этого URL в мой файл app.js бота
  3. После этого мне нужно было возобновить разговор с ботом
  4. Для этого я создал вспомогательный файл - helper.js, в котором переменная 'marker' равна 'undefined', когда данные из URL еще не собраны, а переменная 'marker' представляет собой некоторую 'строку', когда данные собираются, и мы можем продолжитьнаша беседа с ботом

helper.js

    var marker;

    module.exports = {
      checkAddressStatus: function() {
        return marker;
      },
      saveAddressStatus: function(options) {
        marker = options.conversation.id;
      }
    }
Я могу успешно обновить переменную 'marker' моими данными, вызвав функцию saveAddressStatus из app.js. Однако, когда я вернусь к написанию своего кода, который связан с потоком разговоров ботов ( К месту в коде, после которого я открыл URL - в файле address.js, и откуда я планирую непрерывно проверить переменную 'marker', обновлена ​​ли она уже - чтобы запуститьвведите команду «next ()» и продолжите сеанс session.endDialogWithResult ->, а затем -> для продолжения потоков разговоров бота - Я не могу найти эквивалент цикла «while» в Node.js для возобновления сеанса в ботедиалог - возвращая функцию next () и продолжая поток ботов.

address.js

...
lib.dialog('/', [
    function (session, args, next) {
    ...
    next();
    },
    function (session, results, next) {
    // Herocard with a link to external url

    // My stupid infinite loop code, I tried various options, with promises etc., but it's all not working as I expect it
      while (typeof helper.checkAddressStatus() == 'undefined') {
        console.log('Undefined marker in address.js while loop')
      }

      var markerAddress = helper.checkAddressStatus();
      console.log(markerAddress);
      next(); // THE MOST IMPORTANT PART OF THE CODE - IF markerAddress is not 'undefined' - make another step in dialog flow to end dialog with result
   function(session, results) {
    ...session.endDialogWithResult({markerAddress: markerAddress})
}
...

Любые идеи, как сделать оченьпростой аналок "до цикла" в этом контексте - работа?

1 Ответ

0 голосов
/ 22 февраля 2019

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

Вместо того, чтобы запускать свой вспомогательный класс в созданной вами конечной точке, вы должны отправить упреждающее сообщение пользователю, чтобы продолжить диалог.Для этого вам необходимо получить ссылку на беседу из сеанса и закодировать ее в URL-адресе, который вы отправляете пользователю.Вы можете получить ссылку на беседу из сеанса - session.message.address - и, по крайней мере, вам потребуется закодировать идентификатор бота, идентификатор беседы и serviceUrl в URL.Затем, когда вы отправляете данные, собранные от пользователя, обратно в бота, включите подробные сведения о беседе для проактивного сообщения.Наконец, когда ваш бот получает данные, заново создайте ссылку на беседу и отправьте упреждающее сообщение пользователю.

Вот как должна быть структурирована ссылка на беседу:

const conversationReference = {
    bot: {id: req.body.botId },
    conversation: {id: req.body.conversationId},
    serviceUrl: req.body.serviceUrl
};

ВотПример отправки проактивного сообщения:

function sendProactiveMessage(conversationReference ) {
   var msg = new builder.Message().address(conversationReference );
   msg.text('Hello, this is a notification');
   msg.textLocale('en-US');
   bot.send(msg);
}

Для получения дополнительной информации об отправке проактивных сообщений, ознакомьтесь с этими samples и этой документацией для проактивных сообщений.

Надеюсь, это поможет!

...