我正在使用 dialogflow-fulfillment-
nodejs
客户端开发Dialogflow
webhook,以查找城市的温度。在使用服务获取城市温度时,一切正常,还会生成正确的响应,但是即使调用正确的方法,也不会将响应发送给用户。
这是Dialogflow GitHub存储库中的问题
码
function getTemp(agent) {
const timeStart = new Date().getTime();
console.info(`temp function called`);
// agent.add(`Temperature in New Delhi is 50 degree Celsius!`); // This works
serviceRequest.getTemp("New Delhi", function(resp){
if (resp['status'] === 'Y') {
// success
const msg = `Temperature in New Delhi is ${resp['temp']} Celsius!`;
console.log(`Speech Response -- ${msg}`);
console.log(`Type of msg -> ${typeof msg}`);
agent.add(msg);
} else {
// failure
agent.add(`There was some error with the backend. Please try again later.`);
}
const timeEnds = new Date().getTime();
console.log("\nComplete 'getTemp' process took " + (timeEnds - timeStart) + " milliseconds.")
});
console.log("------ temperature function ends here ------");
}
'getTemp': function (city, callback) {
let respBack = {};
doTimeOutTest(function(resp){
respBack['temp'] = resp;
respBack['status'] = 'Y';
callback(respBack);
});
}
function doTimeOutTest(callback){
// below commented code takes < 10 ms to execute, but does not send any response back to dialogflow as call ends before it is executed
// setTimeout(function() {
// callback("30 degree");
// }, 1);
// Below code works even when it takes more time to execute
for(let i=0; i<10000; i++){
for(let j=0; j<10000; j++){
//
}
}
callback("30 degree");
}
控制台日志
当注释的代码运行时
>>>>>>> S E R V E R H I T <<<<<<<
temp function called
------ temperature function ends here ------
Speech Response -- Temperature in New Delhi is 30 degree Celsius!
Type of msg -> string
Complete 'getTemp' process took 10 milliseconds.
当未注释的代码运行时
>>>>>>> S E R V E R H I T <<<<<<<
temp function called
Speech Response -- Temperature in New Delhi is 30 degree Celsius!
Type of msg -> string
Complete 'getTemp' process took 77 milliseconds.
------ temperature function ends here ------
NodeJS Dialogflow src代码链接-https: //github.com/dialogflow/dialogflow-
fulfillment-nodejs/blob/master/src/dialogflow-
fulfillment.js
您需要在处理函数中返回一个Promise。函数处理程序现在支持promise,因此您可以返回promise,并在promise中处理诸如http请求之类的事情。这是使用请求库的示例:
function dialogflowHanlderWithRequest(agent) {
return new Promise((resolve, reject) => {
request.get(options, (error, response, body) => {
JSON.parse(body)
// processing code
agent.add(...)
resolve();
});
});
};
您还可以将HTTP调用移至另一个返回Promise的函数。这是axios库的示例:
function dialogflowHandlerWithAxios(agent) {
return callApi('www.google.com').then(response => {
agent.add('My response');
}).catch (error => {
// do something
})
};
function callApi(url) {
return axios.get(url);
}
我有一个测试方法,看起来像: 并行工作使用可关闭的资源来控制生命周期,该资源在方法中关闭: 问题是:方法是在完成工作之前和等待超时到期之前调用的。 怎么可能?那我该怎么解决呢?
问题内容: 我创建了一个for循环,该循环循环了元素出现在容器中的次数。for循环从HTML捕获一些数据,并创建一个JSON url,然后将返回一个值。然后应将该值添加到适当位置的HTML中。 问题似乎是for循环在进行所有Ajax调用之前完成,因此仅将最后一个值添加到HTML。我以为可以确保readystate等于4,但是该解决方案不起作用。我还尝试将完整而不是成功用作Ajax事件。有什么见解吗
问题内容: 我已经与SwingWorker一起工作了一段时间,并最终出现了奇怪的行为,至少对我而言。我清楚地了解,由于性能原因,一次调用中合并了多个对publish()方法的调用。这对我来说非常有意义,我怀疑SwingWorker会保留某种队列来处理所有调用。 根据教程和API,当SwingWorker结束执行时,doInBackground()正常完成,或者从外部取消了工作线程,然后调用done
问题内容: 问题 我正在使用内联函数定义设置反应 然后在DOM引用中未设置 我的理解是,回调应该在安装期间运行,但是在ref回调函数 之前* 调用添加语句揭示。 * 例如,我看过的其他代码示例在github上的讨论都表明相同的假设,应该在中定义的任何回调 之后调用,甚至在对话中也要说明 那么在所有的ref回调都执行完之后,componentDidMount是否被触发? 是。 我正在使用反应 15.
我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种
问题内容: 假设我有一个事件处理程序,它对服务器进行了两次AJAX调用: 我意识到,调用回调的顺序是不确定的,因为它取决于每个请求花费的时间等。 但是,这是我的问题:是否可以保证在调用两个回调函数之前到达事件处理程序的末尾?我已经读过页面的所有Javascript都在一个线程中执行,因此我认为这意味着在可以调用任何回调之前,一定要完成我的事件处理程序。 这样对吗?还是有可能第一个请求可能已经完成,