async函数内Promise时序异常导致返回undefined问题排查
问题根源
返回undefined是典型的Promise异步时序错误:
sdk.account.createSession()是异步方法,返回Promise对象,传入.then()的回调会被压入微任务队列,必须等当前所有同步代码执行完毕才会运行- 你在同步代码块里直接
return userLogin时,回调内给userLogin赋值的逻辑还没执行,此时userLogin还是初始声明的undefined - 同时
login函数既没有标记为async,也没有将Promise作为返回值,外层调用时完全不会等待接口请求完成,直接拿到undefined往下执行。
修复方案
直接用async/await语法改写逻辑,避免混用同步return和.then()回调,从根源上消除时序错乱问题:
import { Appwrite } from 'appwrite'; export async function post({ locals, request }) { const { email, password } = await request.json(); // 将login声明为async函数,内部可直接等待异步请求结果 async function login() { const sdk = new Appwrite(); sdk .setEndpoint('https://') // 替换为你的API Endpoint .setProject('') // 替换为你的项目ID ; console.log('login.json.js', { email, password: !!password }); // 等待接口请求完成拿到响应后,再执行后续逻辑 const response = await sdk.account.createSession(email, password); console.log(response); const userLogin = response.providerUid; console.log(userLogin); return userLogin; } try { // 调用async函数必须加await,等login执行完成拿到真实返回值再往下走 const user = await login(); locals.user = user; return { status: 200 }; } catch (error) { console.log(error); const message = `Error in endpoint /api/login.json: ${error}`; return { status: 500, body: message }; } }
关键注意点
- 所有返回Promise的异步操作,要么在前面加
await等待结果,要么把依赖异步结果的逻辑全部写到.then()回调内部,绝对不能在Promise外部同步读取异步赋值的变量 - 调用async声明的函数时,必须加
await(或配套.then()回调)才能拿到真实返回值,否则拿到的永远是pending状态的Promise对象 - 改写为async/await写法后,接口请求抛出的错误会直接被外层try/catch捕获,不需要单独在
.then()里传错误回调。
内容的提问来源于stack exchange,提问作者Marcus Martin
相关产品推荐
相关产品推荐

