为什么我的无限循环在异步函数中阻塞?

IT技术 javascript asynchronous async-await es6-promise
2021-01-22 08:46:49

我不明白如何使用异步函数。

为什么下面的代码会停止主线程?

async function foo() {
  for (;;) {}
}
foo();
2个回答

async一般的关键字,并Promise,不使同步代码异步,慢跑代码快,或阻断代码无阻塞。

async只是让函数返回一个Promise并提供(使用await关键字)一种机制来与其他Promise进行交互,就好像有同步一样。

你的函数开始一个循环,然后就循环往复。

它没有到达函数的末尾,这将结束函数并解析它返回的Promise。

它不会到达await关键字并在等待等待的Promise得到解决时暂停。

只是绕来绕去。

如果你真的在循环中一些计算量很大的事情,并且你想推到后台,那么你可以使用 Node.js Worker Thread或基于浏览器的Web Worker来完成它。

async关键字放在函数之前仅意味着这是异步函数。您需要await在要实际等待的函数之前包含关键字像这样:

async function hashPin(pin){
    const hashedPin = await bcrypt.hash(pin, saltRounds);
}

这只是我的一个项目的示例(发布前已删除冗余代码)

async前面的函数有两个目的。1. 启用await在函数中的使用。2.它告诉调用者保证这个函数返回一个Promise。但是既不能async也不能await神奇地解决阻塞问题。因此,如果其中bcrypt.hash包含一些阻塞代码,那么await在它前面将无法解决该阻塞问题。删除await和写入async function hashPin(pin){ return bcrypt.hash(pin, saltRounds).then( hashedPin => /*...*/)}不会对阻塞产生影响。
2021-03-16 08:46:49
很好,这个对我有用。
2021-04-01 08:46:49
我不确定为什么这会起作用,因为无限循环仍然会阻塞。
2021-04-04 08:46:49
你们是对的,我完全错过了关于无限循环的部分,只提供了如何使用异步函数的答案。我的错
2021-04-05 08:46:49