await 和 ternary 之间的运算符优先级
Operator precedence between await and ternary
我用 Chrome 控制台试过了:
const foo = async () => 1;
const bar = async () => 2;
(await 1) ? foo() : bar();
结果为 1。
你能解释一下吗? return 不是 Promise 吗?
await 需要 async 函数作为参数,它会停止操作,直到返回 async 函数中的 promise。在您的情况下, 1 是表达式,因此会立即返回。现在,您的三元运算符将 1 作为表达式,这在 JavaScript 的逻辑中为真。这将触发您的第一个功能,即 foo
所以你的结果将是 1
await
通过调用 Promise.resolve(operand)
将非承诺操作数强制转换为承诺。所以
(await 1)
变成
(await Promise.resolve(1))
和 Promise.resolve(1)
returns 以值 1 实现的承诺。
等待 returns 后(异步 - 在承诺作业队列中执行作业后*)三元表达式被评估为
1 ? foo() : bar() // calls foo()
await
运算符的优先级似乎与其他一元运算符的优先级相同。
*注意 await
永远不会在事件循环的同一个调用中继续执行,即使它正在等待的承诺已经实现:它总是 returns 在事件的另一个调用中循环。
似乎 chrome 控制台在幕后做了一些事情,这不是这个问题的关注点。运行结果符合预期
感谢 Paulpro
我用 Chrome 控制台试过了:
const foo = async () => 1;
const bar = async () => 2;
(await 1) ? foo() : bar();
结果为 1。
你能解释一下吗? return 不是 Promise 吗?
await 需要 async 函数作为参数,它会停止操作,直到返回 async 函数中的 promise。在您的情况下, 1 是表达式,因此会立即返回。现在,您的三元运算符将 1 作为表达式,这在 JavaScript 的逻辑中为真。这将触发您的第一个功能,即 foo 所以你的结果将是 1
await
通过调用 Promise.resolve(operand)
将非承诺操作数强制转换为承诺。所以
(await 1)
变成
(await Promise.resolve(1))
和 Promise.resolve(1)
returns 以值 1 实现的承诺。
等待 returns 后(异步 - 在承诺作业队列中执行作业后*)三元表达式被评估为
1 ? foo() : bar() // calls foo()
await
运算符的优先级似乎与其他一元运算符的优先级相同。
*注意 await
永远不会在事件循环的同一个调用中继续执行,即使它正在等待的承诺已经实现:它总是 returns 在事件的另一个调用中循环。
似乎 chrome 控制台在幕后做了一些事情,这不是这个问题的关注点。运行结果符合预期
感谢 Paulpro