Как получить данные, используя Dialogflow Fulfillment из Firebase - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время я работаю над чатботом с часто задаваемыми вопросами.Некоторые ответы будут конкретными в зависимости от параметров пользователя, поэтому я решил использовать Webhook, чтобы получить ответ из своей базы данных Firebase.После некоторых исследований я заметил, что Dialogflow работает асинхронно, и мне пришлось использовать Promise, но я все еще не могу сделать ответ динамичным и синхронным.

Вот мой код:

    function fetch_data(param)
    {
        return function(agent)
        {
            console.log("Fetching informations ...");
            var result = database_call();

            result.then(function(response)
            {
                agent.add(response);
            });
            agent.add("Timeout !")
        };
    }

    function database_call()
    {
        return new Promise((resolve, reject) => {
            var ref = db.ref("test/");
            var refTest = ref.child('test');
            refTest.on("value", function(snapshot)
            {
                console.log(snapshot.val());
                resolve(snapshot.val());
            });
            agent.add("[TIMEOUT] Cannot fetch data !")
        });
    }

Я всегда получаю сообщение: Невозможно получить данные, несмотря на функцию Promise.В моем журнале я замечаю, что данные всегда печатаются через несколько секунд после сообщения «timeout».

1 Ответ

0 голосов
/ 22 октября 2018

Поскольку он асинхронный, он всегда печатает тайм-аут.

Переместите тайм-ауты в регистр сбоя для контрольного теста.

refTest.on("value", function(snapshot)
{
  console.log(snapshot.val());
  resolve(snapshot.val());
});

refTest.on("error", function(snapshot)
{
  agent.add("[TIMEOUT] Cannot fetch data !")
  reject();
});

Затем вы можете обнаружить ошибку.

result.then(function(response)
{
  agent.add(response);
}).catch(() => {
  agent.add("Timeout !")
});
...