You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容易出现变量污染问题。
修复方案
  1. 首先在调用GetCertain_info的意图注册位置添加await,示例如下:
// 意图注册处修改示例
intentMap.set('你对应的意图名称', async (agent) => {
  // 必须加await等待异步函数执行完成
  await GetCertain_info(agent);
});
  1. 优化原有逻辑,去掉冗余代码,改用异步返回值赋值替代全局变量,修复后的完整代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 13:27:02