You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用点运算符访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:17:26