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
相关产品推荐
相关产品推荐

