如何在异步访问返回对象中访问属性

时间:2019-07-19 12:09:44

标签: javascript ecmascript-6 async-await

为什么我不能在异步等待返回对象中使用.访问对象属性? 我知道我可以访问以下属性。

let val1 = await call(3);
let val2 = await call(4);

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

let v = await call(3).val + await call(4).val;

const call = (x) => {

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

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

const dummy = async () => {

    //let val1 = await call(3);
    //let val2 = await call(4);
    //alert(value.val + val2.val);
    let v = await call(3).val + await call(4).val;
    alert(v);
}

dummy()

4 个答案:

答案 0 :(得分:3)

您正在尝试等待承诺的val属性的值

您需要等待 promise ,然后从结果中读取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()

答案 1 :(得分:2)

  

为什么我不能在异步等待中使用.访问对象属性   对象?

因为call返回Promise,因此没有属性val。当await返回的Promise时,表达式await call(x)最终将解析为{val: x},然后可以在其上使用.val

因此,您可以分别await每次调用并将返回的对象保存在它们自己的变量中,或者将表达式await call(x)用其自己的括号括起来,从而得到{{1 }},而不是承诺:

.val

答案 2 :(得分:1)

只需将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()

请注意,通过这种方式,您要等待第一个电话的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()

答案 3 :(得分:0)

这是因为调用未返回直接结果对象。它正在返回一个将解析.then回调中的值的promise。您可以等待此呼叫。

const call = (x) => {

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

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

const dummy = async () => {

    //let val1 = await call(3);
    //let val2 = await call(4);
    //alert(value.val + val2.val);
    let v = await call(3).then(result => result.val) + await call(4).then((result)=> result.val);
    alert(v);
}

dummy()