我有两个函数a
和b
是异步的,前者没有await
,后者是await
。他们都将某些内容记录到控制台并返回undefined
。在调用函数的任何一个之后,我会记录另一条消息,并查看消息是在执行函数主体之前还是之后写入的。不用等待在Javascript中的异步函数
function someMath() {
for (let i = 0; i < 3000000; 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() {
a()
console.log('after a (no await) call')
}
bButton.onclick = function() {
b()
console.log('after b (await) call')
}
<button id="aButton">test without await</button>
<button id="bButton">test with await</button>
<button id="clear">clear console</button>
如果启动测试,而不await
功能似乎工作,如果它是同步的。但与await
,该消息是反转作为功能异步执行。
所以我的问题是:JavaScript如何执行async
功能当没有await
关键字存在?
实际使用情况:我有的conditionnaly执行的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()
PS:标题有javascript关键字,以避免与其他语言的相同问题混淆(即https://stackoverflow.com/q/12016567/6320039)
您还需要将'bButton.onclick'函数转换为异步函数并等待'b()'结束才能获得所需的日志。 –
@JoseHermosillaRodrigo我不想等待所需的日志,我想知道使用或不使用'await'关键字改变同步功能。如果没有,也许为什么我的测试是错误的。我会在最后更新我的真实使用案例,也许它会更清晰。 –