Dialogflow中async/await结合Promise时agent.add动态文本失效问题
问题原因
- 核心原因:使用
agent.add的会话框架(常见为Dialogflow fulfillment)要求,包含异步操作的意图处理函数必须返回Promise,框架会等待Promise状态变更后才会将agent收集的响应返回给用户。你当前的GetCertain_info虽然是async函数(本身默认返回Promise),但上层调用该函数的代码没有添加await,导致await uiFx()还没执行完成、agent.add还没调用,框架就已经返回了响应,后续的agent.add自然不会生效。 - 次要问题:
uiFx函数存在冗余的Promise包装,引入的ui()本身已经返回Promise,不需要手动套一层new Promise,同时用全局变量存储message容易出现变量污染问题。
修复方案
- 首先在调用
GetCertain_info的意图注册位置添加await,示例如下:
// 意图注册处修改示例 intentMap.set('你对应的意图名称', async (agent) => { // 必须加await等待异步函数执行完成 await GetCertain_info(agent); });
- 优化原有逻辑,去掉冗余代码,改用异步返回值赋值替代全局变量,修复后的完整代码如下:
async function GetCertain_info(agent) { let message = "hi"; // 放到函数内部,避免全局污染 console.log("1" + message); // 直接拿uiFx的返回值赋值 message = await uiFx(); console.log("2" + message); agent.add("Here are the information on " + message); // 可根据需要开启异常捕获逻辑 /* try { message = await uiFx(); agent.add("Here are the information on " + message); } catch (err) { console.error('信息获取失败', err); agent.add('抱歉,暂时无法获取相关信息'); } */ } async function uiFx() { const { ui } = require('./uia.js'); // 直接返回ui的执行结果,无需手动封装Promise return ui().then((msg) => { console.log("Destination Message : " + msg); return msg; }).catch((msg) => { console.log(msg); // 若需要错误时正常返回内容就return msg,需要抛出异常就用throw msg return msg; }); }
内容的提问来源于stack exchange,提问作者Mounir
相关产品推荐
相关产品推荐

