将ConnectyCube Promise授权代码重构为try-catch时遇异步问题求助
你的重构代码存在的核心问题分析
咱们一步步拆解你重构时踩的几个关键坑:
1. 回调式API未正确包装为Promise,try/catch无法捕获异步错误
ConnectyCube.createSession和ConnectyCube.login都是基于回调的异步API,直接把它们放在try块里完全起不到错误捕获作用:
- 回调函数里的错误不会冒泡到外层
try/catch,因为回调是异步执行的,外层代码早就执行完毕 - 你在回调里写的
return session.user或return user根本不会被外层函数接收,相当于无效代码
原来的代码之所以能正常工作,核心是把这些回调API包装成了Promise,这样才能用await和try/catch处理异步逻辑。
2. createSession函数丢失了异步能力
重构后的createSession没有返回Promise,也没处理异步操作的结果:
- 原版本的
createSession返回Promise,所以await createSession()能真正等待会话创建完成 - 现在的
createSession只是调用了ConnectyCube.createSession,但没有返回任何内容,await相当于等待一个undefined,会直接跳过这一步,导致会话还没创建好就执行login,逻辑顺序完全错乱
3. authorizeConnectyCube未返回登录结果
原版本的authorizeConnectyCube返回Promise,最终会resolve登录后的user;但重构后的函数没有任何返回值,调用这个函数的地方根本拿不到登录后的用户数据。
修复后的正确重构版本
我们保留try/catch的同时,正确包装Promise处理异步逻辑:
export const authorizeConnectyCube = async (accessToken) => { const userCredentials = { provider: 'firebase_phone', 'firebase_phone[project_id]': "xxxxxxxxxx", 'firebase_phone[access_token]': accessToken, }; try { await createSession(); // 将login包装为Promise,配合await获取结果 const user = await new Promise((resolve, reject) => { ConnectyCube.login(userCredentials, (error, user) => { error ? reject(error) : resolve(user); }); }); return user; } catch (error) { console.log('授权过程出错:', error); // 可选择抛出错误让上层调用方处理,避免吞掉错误导致调试困难 throw error; } } const createSession = async () => { try { return await new Promise((resolve, reject) => { ConnectyCube.createSession((error, session) => { error ? reject(error) : resolve(session.user); }); }); } catch (error) { console.log('创建会话出错:', error); throw error; } }
关键改进点
- 所有回调式API都用
new Promise包装,确保能通过await等待异步操作完成 try/catch包裹整个异步流程,能有效捕获Promise的reject错误- 每个异步函数都返回正确的Promise或值,保证调用方能拿到预期结果
- 错误处理时主动抛出错误,避免吞掉异常导致后续逻辑隐藏问题
内容的提问来源于stack exchange,提问作者Mr. Robot
相关产品推荐
相关产品推荐

