NodeJS 异步/等待- Python与Javascript?

plupiseo  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(184)

我试图理解异步编程,即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在等待这两个函数时在做什么?
如果答案是显而易见的,或者我犯了一些愚蠢的错误,我很抱歉。

gz5pxeao

gz5pxeao1#

你的承诺从未兑现(它永远不会被实现或拒绝),最终在await的第一个await处无限期地挂起hello()函数。您需要在resolve()的执行函数中调用它。您可以通过更新执行程序来使用它所传递的resolveFunc,然后在调用setTimeout()回调时调用它来实现这一点:

function stall(func, ms) {
  return new Promise((resolve) => { // use the resolveFunc
    setTimeout(() => {
      resolve(); // resolve the promise
      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();

相关问题