为什么我不能在异步等待返回对象中使用.
访问对象属性?
我知道我可以访问以下属性。
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()
答案 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()