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

Bot Framework中异步获取API数据并实现Prompt.Choice选择功能失败求助

问题分析与解决方案

看你这段Bot Framework的代码,核心问题是没正确处理异步API调用,导致后续逻辑在API返回数据前就执行了,自然拿不到想要的服务列表。

问题出在哪儿?

你用的get.getServices(par, (res) => {})是异步回调模式,当你紧接着写循环的时候,API请求还没完成,servicesJSON(还有你代码里的servicess、servicesComplete应该是笔误吧?)根本还没拿到数据,循环自然跑不起来。而且你没在回调里处理后续逻辑,等于把获取数据和后续的提示选择完全割裂了。

修正后的代码(用async/await)

首先要把dialog的处理函数改成异步函数,同时确保get.getServices能返回Promise(如果原来的只支持回调,可以包装一下):

async function(session) {
    // 如果原getServices只支持回调,先包装成Promise
    const getServicesAsync = (par) => {
        return new Promise((resolve, reject) => {
            get.getServices(par, (res) => {
                if (res) resolve(res);
                else reject(new Error("Failed to get services"));
            });
        });
    };

    try {
        // 等待API返回数据
        const servicesJSON = await getServicesAsync(par);
        // 提取服务名称列表(修正你代码里的变量名错误,推测servicesComplete是servicesJSON的笔误)
        const services = Object.values(servicesJSON).map(service => service.name);
        
        // 调用选择提示,注意参数顺序:session在前,然后是提示文本,最后是选项
        builder.Prompts.choice(session, 'Which service do you want?', services);
    } catch (err) {
        // 处理API请求失败的情况
        session.send(`Oops, failed to load services: ${err.message}`);
    }
}

关键要点

  • 把dialog函数声明为async function,这样就能用await等待异步操作完成
  • 如果你的get.getServices不支持Promise,一定要把它包装成Promise,这样才能用await
  • 修正代码里的变量名错误(比如servicess、servicesComplete这些明显的笔误)
  • builder.Prompts.choice的参数顺序要正确:第一个参数是session,然后是提示文本,最后是选项数组

内容的提问来源于stack exchange,提问作者Jose Manuel Palau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:20:13