使用then处理Async异步调用后仍获取undefined值的问题排查
解决React组件中异步调用返回undefined的问题
问题分析
抽象方法返回类型定义冲突
AbstractBot中doSendMessage被声明为返回Promise<void>,但BBot的doSendMessage实际返回了字符串类型的Promise。这种类型不匹配会导致TS编译阶段存在隐患,运行时返回值可能被隐式处理为undefined。AsyncAbstractBot初始化阶段的占位Bot无返回值
如果你的chat实例是AsyncAbstractBot的子类,在initializeBot完成前会使用DummyBot的doSendMessage——这个方法是空实现,没有返回值,此时调用sendMessage必然得到undefined。参数传递不匹配
GCPanel中调用chat.sendMessage(input)时传入的是字符串,但BBot的doSendMessage期望接收包含onEvent方法的参数对象。虽然你提到BBot能打印text,但参数传递错误会导致后续逻辑存在隐藏问题。
解决方案
1. 修正抽象方法的返回类型
修改AbstractBot中doSendMessage的返回类型,匹配实际业务返回值:
export abstract class AbstractBot { async sendMessage(params) { return await this.doSendMessage(params) } // 根据实际场景定义返回类型,这里改为Promise<string> abstract doSendMessage(params): Promise<string> }
2. 给DummyBot添加合规返回值
确保初始化阶段的占位Bot返回符合类型要求的值:
class DummyBot extends AbstractBot { async doSendMessage(_params) { // 返回空字符串或符合业务逻辑的默认值 return '' } }
3. 修正参数传递逻辑
在GCPanel中调用sendMessage时,传入包含onEvent的正确参数对象:
const onUserSendMessage = useCallback( (input: string, botId?: BotId) => { const chat = chats.find((c) => c.botId === botId) // 构造符合要求的params对象 const params = { input, onEvent: (event) => { // 按需处理事件,比如更新聊天界面 console.log('收到事件:', event) } } const ret = chat?.sendMessage(params); ret?.then((value) => { console.log("GCPanel ret:", value); }); }, [chats], )
4. 等待AsyncAbstractBot初始化完成(可选)
如果使用AsyncAbstractBot,可以添加初始化状态判断,避免在Bot未就绪时调用方法:
export abstract class AsyncAbstractBot extends AbstractBot { #bot: AbstractBot #isInitialized = false constructor() { super() this.#bot = new DummyBot() this.initializeBot().then((bot) => { this.#bot = bot this.#isInitialized = true }) } abstract initializeBot(): Promise<AbstractBot> async doSendMessage(params) { // 未初始化完成时等待并重试 if (!this.#isInitialized) { await new Promise(resolve => setTimeout(resolve, 100)) return this.doSendMessage(params) } return this.#bot.doSendMessage(params) } get name() { return this.#bot.name } }
内容的提问来源于stack exchange,提问作者ishandutta2007
相关产品推荐
相关产品推荐

