如何访问异步等待返回对象中的属性

NuO*_*One 5 javascript async-await ecmascript-6

为什么我无法使用.异步等待返回对象访问对象属性?我知道我可以访问如下属性。

let val1 = await call(3);
let val2 = await call(4);
Run Code Online (Sandbox Code Playgroud)

但我很感兴趣这是否可以做到

let v = await call(3).val + await call(4).val;
Run Code Online (Sandbox Code Playgroud)

let val1 = await call(3);
let val2 = await call(4);
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 6

您正在尝试等待Promiseval属性的值。

您需要等待承诺,然后val从结果中读取属性:(await call(3)).val

const call = (x) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve({
                val: x
            });
        }, 3000)
    })
}

const dummy = async () => {
    let v = (await call(3)).val + (await call(4)).val;
    alert(v);
}

dummy()
Run Code Online (Sandbox Code Playgroud)


Jos*_*eph 5

只需将await要等待的表达式括在括号中即可。然后访问该属性。

const call = (x) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({
        val: x
      });
    }, 3000)
  })
}

const dummy = async() => {
  let v = (await call(3)).val + (await call(4)).val;
  alert(v);
}

dummy()
Run Code Online (Sandbox Code Playgroud)

请注意,这样做时,您将等待第一个呼叫 3 秒,然后再等待第二个呼叫 3 秒。除非第二个调用在某种程度上依赖于第一个,否则我建议您执行以下操作:

const call = (x) => {

  return new Promise((resolve, reject) => {

    setTimeout(() => {
      resolve({
        val: x
      });
    }, 3000)
  })
}

const dummy = async() => {
  // Call both in parallel
  let val1 = call(3);
  let val2 = call(4);
  
  // Await for both
  let v = await Promise.all([val1, val2]);
  
  // *then* add
  alert(v[0].val + v[1].val);
}

dummy()
Run Code Online (Sandbox Code Playgroud)