await和ternary之间的运算符优先级

时间:2018-01-04 03:47:45

标签: javascript async-await ternary

我在Chrome控制台上尝试了这个:

const foo = async () => 1;
const bar = async () => 2;
(await 1) ? foo() : bar();

结果是1。

你能解释一下吗?是不是假设要退回承诺?

3 个答案:

答案 0 :(得分:2)

await通过调用Promise.resolve(operand)强制承诺的非承诺操作数。所以

 (await 1)

成为

 (await Promise.resolve(1))

Promise.resolve(1)返回值为1的承诺。

await返回后(异步 - 在promise作业队列*中执行作业后),三元表达式被评估为

 1 ? foo() : bar()  // calls foo()

await运算符的优先级似乎与其他一元运算符的优先级相同。

*注意await永远不会在事件循环的同一个调用中继续执行,即使它正在等待的承诺已经完成:它总是在事件循环的另一个调用中返回。

答案 1 :(得分:1)

看起来Chrome控制台在引擎盖下做了一些事情并不是这个问题的关注点。操作的结果与预期一致。

Perhaps this is a only bug of chrome console?

感谢Paulpro

答案 2 :(得分:0)

await期望异步函数作为参数,它会暂停操作,直到返回异步函数中的promise。在你的情况下,1是表达式,因此它立即返回。现在你的三元运算符将1作为表达式,这在JavaScript的逻辑中是正确的。这将触发你的第一个功能,即foo 所以你的结果将是1