我有一个情况,我想在三元运算符中使用await。我想根据条件将一个值设置为字面值或承诺的解析值。希望下面的代码能帮助描述我的意图,但我相当确定它不正确,所以把它看作伪代码。
const val = checkCondition ? "literal value" : await promiseGetValue();
promiseGetValue() 返回一个解析为字面值的 Promise。正确的做法是什么?
我有一个情况,我想在三元运算符中使用await。我想根据条件将一个值设置为字面值或承诺的解析值。希望下面的代码能帮助描述我的意图,但我相当确定它不正确,所以把它看作伪代码。
const val = checkCondition ? "literal value" : await promiseGetValue();
promiseGetValue() 返回一个解析为字面值的 Promise。正确的做法是什么?
这实际上是一种有效的语法,只是为了清晰起见,您可以用括号将 await promiseGetValue() 包围起来。以下是此语法的演示。
const returnPromise = () => Promise.resolve('world')
const f = async () => {
const x = true ? 'hello' : await returnPromise()
const y = false ? 'hello' : await returnPromise()
console.log(x,y)
}
f()
条件运算符期望作为操作数的表达式,await value
是一个有效的表达式。
因此,如果在异步函数中使用或在支持顶级 await
的模块的顶层中使用(其中await
是有效的),您的代码是完全有效的。
我在这方面不能再说什么了。
只要带有async
关键字的函数,使用三元运算符与await
是有效的。
function promiseFunc() {
return Promise.resolve({ some: 'data' });
}
async function myFunc(condition) {
return condition ? await promiseFunc() : null;
}
(async () => {
console.log(await myFunc(true)) // { some: 'data' }
})()
在ehab的回答的基础上:你写的方式完全没问题,但你也可以这样做:
const returnPromise = () => Promise.resolve("world");
const f = async () => {
const x = await (true ? returnPromise() : returnPromise());
console.log(x);
};
f();
也就是说,将完整的三元表达式用括号包裹起来,然后在前面加上await
。如果没有括号,你只会得到await true
。
function promiseGetValue() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('any value')
})
})
}
const flag = false
async function main() {
const val = flag ? "literal value" : await promiseGetValue();
console.log(val)
}
main()