JavaScript在三元运算符中使用单个await

13

我有一个情况,我想在三元运算符中使用await。我想根据条件将一个值设置为字面值或承诺的解析值。希望下面的代码能帮助描述我的意图,但我相当确定它不正确,所以把它看作伪代码。

const val = checkCondition ? "literal value" : await promiseGetValue();

promiseGetValue() 返回一个解析为字面值的 Promise。正确的做法是什么?


请查看此帖子:https://medium.com/@griffinmichl/async-await-with-ternary-operators-af19f374215 - Denis Stukalov
你需要帮助的问题是什么?你的代码看起来是有效的。 - jfriend00
5个回答

9

这实际上是一种有效的语法,只是为了清晰起见,您可以用括号将 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()


7

条件运算符期望作为操作数的表达式,await value 是一个有效的表达式。

因此,如果在异步函数中使用或在支持顶级 await 的模块的顶层中使用(其中await是有效的),您的代码是完全有效的。

我在这方面不能再说什么了。


1

只要带有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' }
    })()


1

ehab的回答的基础上:你写的方式完全没问题,但你也可以这样做:

const returnPromise = () => Promise.resolve("world");
const f = async () => {
  const x = await (true ? returnPromise() : returnPromise());
  console.log(x);
};
f();

也就是说,将完整的三元表达式用括号包裹起来,然后在前面加上await。如果没有括号,你只会得到await true


1
您可以使用这个语法,但是您应该始终在async函数内部使用await。您可以从等待的函数中返回任何值(它不必是promise,但是在没有返回promise的函数上使用await没有意义)。

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()


仅翻译文本:只有回答无解释性文本的内容才能通过添加解释某个你试图阐述的观点的文本而得到改进和完善。 - jfriend00
感谢您的建议。 - swapnil koche
另外,当我尝试在片段中运行您的代码时,它无法运行,因为“checkCondition”未定义。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接