我有两个函数,a
和 b
,它们是异步的,前者没有 await
,后者有 await
。它们都将某些内容记录到控制台并返回 undefined
。在调用其中一个函数之后,我将记录另一条消息,并查看该消息是在执行函数体之前还是之后写入的。
function someMath() {
for (let i = 0; i < 9000000; i++) { Math.sqrt(i**5) }
}
function timeout(n) {
return new Promise(cb => setTimeout(cb, n))
}
// ------------------------------------------------- a (no await)
async function a() {
someMath()
console.log('in a (no await)')
}
// ---------------------------------------------------- b (await)
async function b() {
await timeout(100)
console.log('in b (await)')
}
clear.onclick = console.clear
aButton.onclick = function() {
console.log('clicked on a button')
a()
console.log('after a (no await) call')
}
bButton.onclick = function() {
console.log('clicked on b button')
b()
console.log('after b (await) call')
}
<button id="aButton">test without await (a)</button>
<button id="bButton">test with await (b)</button>
<button id="clear">clear console</button>
如果您在启动测试时没有使用 await
,那么这个函数看起来就像是同步的一样。但是对于 await
,消息是 倒过来,因为函数是异步执行的。
当不存在 await
关键字时,JavaScript 如何执行 async
函数?
实际用例: 我有一个有条件执行的 await
关键字,为了呈现我的元素,我需要知道函数是否同步执行:
async function initializeComponent(stuff) {
if (stuff === undefined)
stuff = await getStuff()
// Initialize
if (/* Context has been blocked */)
renderComponent() // Render again if stuff had to be loaded
}
initializeComponent()
renderComponent()
P.S: 标题有 JavaScript 关键字,以避免与其他语言(即 不等待地使用异步)中的相同问题混淆