为何await Promise.resolve对象后返回undefined?求排查原因
嘿,这个问题我之前遇到过类似的情况,咱们来一步步拆解可能的原因和排查方向:
检查
migration对象的user属性是否有自定义getter/setter
这是最常见的原因!如果migration.user被定义了自定义的setter方法,赋值时可能会把传入的Promise意外处理坏。比如如果setter逻辑是这样的:set user(value) { // 错误示例:试图获取一个不存在的属性,导致存储的是undefined this._user = value.nonExistentProperty; }当你赋值
Promise.resolve(user)时,setter可能错误地处理了这个Promise对象,导致后续await时拿到undefined。你可以用这个代码查看属性描述符:console.log(Object.getOwnPropertyDescriptors(migration, 'user'));如果输出里有
get或set字段,那就要重点检查这部分逻辑。确认
user对象是否在Promise创建后被意外修改
虽然你在赋值前console.log(user)显示正常,但如果user本身是一个访问器属性(getter),而不是普通对象,那Promise.resolve(user)捕获的可能是后续变化后的值。或者在migration.user = Promise.resolve(user)到await migration.user之间,有其他代码把user改成了undefined。不过这种情况概率较低,你可以先单独测试Promise本身:const testPromise = Promise.resolve(user); console.log(await testPromise); // 如果这里输出正常,说明问题不在Promise本身排查
migration对象是否被重新赋值
如果在赋值migration.user之后,有代码把migration整个替换成了新对象(比如migration = {}),那你后续await migration.user访问的是新对象的user属性,自然就是undefined了。
快速验证方案
先跳过migration对象,直接测试Promise的有效性:
const tempUser = user; const tempPromise = Promise.resolve(tempUser); console.log(await tempPromise);
如果这段代码能正常输出用户对象,那100%是migration对象的user属性有问题,或者migration本身被修改了。
内容的提问来源于stack exchange,提问作者Aiden McClelland

