为何无法用点运算符访问async/await返回对象属性?能否链式取值?
为啥没法直接用
await call(3).val访问属性? 嗨,这个问题我太懂了!咱们先拆明白核心问题出在哪:
你写的call(x)函数返回的是一个Promise实例,而不是你最终resolve出来的{val: x}对象。当你直接写call(3).val时,你是在Promise对象本身上找val属性——但Promise根本没有这个属性啊!所以这时候call(3).val会得到undefined,再用await去等undefined,结果还是undefined。同理await call(4).val也是undefined,加起来自然就是NaN,alert出来肯定不对。
为啥优先级是关键?
这里还要提一下JavaScript的运算符优先级:成员访问(.)的优先级比await高。所以你写的await call(3).val,JS会先执行call(3).val,再对这个结果做await操作——这完全不是你想要的顺序!你需要的是先await call(3)拿到resolved的对象,再访问它的val属性。
正确的写法有两种:
1. 加括号改变优先级
把await call(3)用括号包起来,确保先等待Promise完成,再取属性:
const dummy = async () => { let v = (await call(3)).val + (await call(4)).val; alert(v); // 这里会弹出7,完全正确! }
2. 用Promise.all并行执行(更高效)
如果这两个异步操作互相不依赖,推荐用Promise.all让它们同时执行,这样总等待时间从6秒变成3秒:
const dummy = async () => { // 同时发起两个请求,等待所有结果返回 const [result3, result4] = await Promise.all([call(3), call(4)]); let v = result3.val + result4.val; alert(v); // 同样弹出7,但效率更高 }
原来你注释掉的写法(先分别await再取属性)也是正确的,本质和第一种写法一样,只是拆分了步骤而已。
内容的提问来源于stack exchange,提问作者noone
相关产品推荐
相关产品推荐

