我目前正在开发一个常见问题聊天机器人。
根据用户的参数,一些答案是特定的,所以我决定使用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函数,但无法获取数据。
在我的日志中,我注意到数据总是在“超时”消息出现几秒钟后打印出来。
发布于 2018-10-22 20:48:51
因为它是异步的,所以它将始终打印超时。
将超时移至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 !")
});https://stackoverflow.com/questions/52929110
复制相似问题