【发布时间】:2018-01-17 13:47:27
【问题描述】:
我有两个函数,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 关键字以避免与其他语言中的相同问题混淆(即Using async without await)
【问题讨论】:
-
您还需要将
bButton.onclick函数转换为异步函数并等待b()结束才能获得所需的日志。 -
@JoseHermosillaRodrigo 我不想等待所需的日志,我想知道使用或不使用
await关键字会改变同步功能。如果没有,也许为什么我的测试是错误的。最后我会更新我的真实用例,也许对你来说会更清楚。
标签: javascript asynchronous async-await