我有两个异步函数,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: 为避免与其他语言中的相似问题混淆(例如在不使用await的情况下使用async),本标题含有JavaScript关键字。
bButton.onclick
函数转换为异步函数,并等待b()
结束,以便获得所需的日志。 - Jose Hermosilla Rodrigoawait
关键字是否会改变同步函数。如果不是这样,也许是我的测试有问题。最后,我会更新我的真实用例,也许对您来说会更清晰。 - Ulysse BN