【问题标题】:How to fetch data using Dialogflow Fulfillment from Firebase如何使用 Firebase 的 Dialogflow Fulfillment 获取数据
【发布时间】:2018-10-22 12:14:01
【问题描述】:

我目前正在开发一个常见问题解答聊天机器人。
一些答案将具体取决于用户的参数,因此我决定使用 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 功能,但无法获取数据。
在我的日志中,我注意到数据总是在“超时”消息后几秒钟打印出来。

【问题讨论】:

    标签: javascript node.js webhooks dialogflow-es fulfillment


    【解决方案1】:

    因为它是异步的,所以它总是会打印超时时间。

    将超时移至 ref 测试的失败案例。

    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 !")
    });
    

    【讨论】:

    • 超时消息不再显示,但我得到:'空响应'。承诺返回的值需要太多时间,因此会打印“默认”答案。我怎样才能使这个调用同步?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多