我试图理解异步编程,即async/await。我目前的理解是,使用await关键字将等待一个承诺解决,然后再继续。考虑到这一点,我用Python和Javascript编写了两个脚本。
Python:
import asyncio
async def stall(func, s):
await asyncio.sleep(s)
func()
async def hello():
def stop():
print("hello() stop")
print("hello() start")
await stall(stop, 5)
async def main():
def stop():
print("main() stop")
print("main() start")
await asyncio.create_task(hello())
await asyncio.create_task(stall(stop, 3))
asyncio.run(main())
Javascript语言:
function stall(func, ms) {
return new Promise(() => {
setTimeout(func, ms)
})
}
async function hello() {
console.log("hello() start")
await stall(() => {console.log("hello() stop")}, 5000)
}
async function main() {
console.log("main() start")
await hello()
await stall(() => {console.log("main() stop")}, 3000)
}
main()
在写脚本的时候,我以为他们会做同样的事情。然而,输出是不同的。
Python:
main() start
hello() start
hello() stop
main() stop
Javascript语言:
main() start
hello() start
hello() stop
使用Powershell,我键入了以下命令:
Measure-Command { node .\async_await.js | out-default }
输出如下:
main() start
hello() start
hello() stop
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 121
Ticks : 51210409
TotalDays : 5.9271306712963E-05
TotalHours : 0.00142251136111111
TotalMinutes : 0.0853506816666667
TotalSeconds : 5.1210409
TotalMilliseconds : 5121.0409
总共应该花8秒吧?我说Javascript会等待hello()而不是main方法中的stall(),对吗?如果是,为什么Javascript不等待stall()完成?如果不是,Javascript在等待这两个函数时在做什么?
如果答案是显而易见的,或者我犯了一些愚蠢的错误,我很抱歉。
1条答案
按热度按时间gz5pxeao1#
你的承诺从未兑现(它永远不会被实现或拒绝),最终在
await
的第一个await
处无限期地挂起hello()
函数。您需要在resolve()
的执行函数中调用它。您可以通过更新执行程序来使用它所传递的resolveFunc
,然后在调用setTimeout()
回调时调用它来实现这一点: