如何在等待耗时超过Dialogflow时限的进程时维持会话正常运行
Dialogflow 5秒超时问题解决方案
问题1:长耗时进程运行时同步执行其他流程
- 移除阻塞主流程的
await uiFx()写法,将长耗时任务转为后台异步执行,主流程触发任务后即可继续执行其他逻辑,无需等待任务返回。 - 若需同时执行多个并行任务,可通过
Promise.all()批量启动异步任务,不需要即时返回结果的任务不要加await,避免阻塞响应。
问题2:先返回「请稍候」提示重置计时的可行性
完全可以,这是Dialogflow处理长耗时任务的标准实现方案,核心逻辑是先返回即时响应避免超时,任务执行完成后再主动推送最终结果,修改后的代码参考如下:
const { SessionsClient } = require('@google-cloud/dialogflow'); const sessionClient = new SessionsClient(); async function GetCertain_info(agent) { // 先返回等待提示,第一时间响应避免触发5秒超时 agent.add("请稍候,正在为您查询相关信息..."); const currentSession = agent.session; // 异步执行长耗时任务,不阻塞当前响应 uiFx() .then(finalResult => { // 任务完成后主动向当前会话推送结果 return sessionClient.detectIntent({ session: currentSession, queryInput: { event: { name: "QUERY_RESULT_READY", parameters: { result: finalResult }, languageCode: "zh-CN" } } }); }) .catch(err => { // 异常时主动推送错误提示 return sessionClient.detectIntent({ session: currentSession, queryInput: { event: { name: "QUERY_ERROR", parameters: { errMsg: err }, languageCode: "zh-CN" } } }); }); } async function uiFx() { const { ui } = require('./uia.js'); // 简化原有Promise包装,直接返回ui()的执行结果即可 return ui() .then(msg => { console.log("Destination Message : " + msg); return "Here are the information on " + msg; }) .catch(msg => { console.log(msg); return "查询失败:" + msg; }); }
额外配置说明
- 你需要提前在Dialogflow控制台创建两个自定义意图,分别绑定
QUERY_RESULT_READY和QUERY_ERROR事件,意图回复直接引用对应参数$result、$errMsg即可。 - 不要使用全局变量存储返回结果,多用户并发场景下会出现数据混乱,直接通过Promise链传递结果即可。
- 如果你对接的是第三方消息渠道,可以直接调用渠道的主动发消息接口推送结果,不需要走Dialogflow事件触发,逻辑更简单。
内容的提问来源于stack exchange,提问作者Mounir
相关产品推荐
相关产品推荐

