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

Javascript 为什么我的无限循环在异步函数中会阻塞?,javascript,asynchronous,async-await,es6-promise,Javascript,Asynchronous,Async Await,Es6 Promise,我不明白如何使用异步函数 为什么下面的代码会停止主线程 async function foo() { for (;;) {} } foo(); async关键字,并承诺在一般情况下,不会使同步代码异步、运行缓慢的代码快速或阻塞代码不阻塞 async只是让函数返回一个承诺,并提供(使用await关键字)一种与其他承诺交互的机制,就好像存在同步承诺一样 函数开始循环,然后循环 它不会到达函数的结尾,这将结束函数并解析它返回的承诺 它没有到达wait关键字,并在等待等待的承诺得到解决时暂停 它只

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

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

async function foo() {
  for (;;) {}
}
foo();

async
关键字,并承诺在一般情况下,不会使同步代码异步、运行缓慢的代码快速或阻塞代码不阻塞

async
只是让函数返回一个承诺,并提供(使用
await
关键字)一种与其他承诺交互的机制,就好像存在同步承诺一样

函数开始循环,然后循环

它不会到达函数的结尾,这将结束函数并解析它返回的承诺

它没有到达
wait
关键字,并在等待等待的承诺得到解决时暂停

它只是一圈又一圈


如果你实际上在循环中做了一些计算成本很高的事情,并且你想进入后台,那么你可以使用Node.js或基于浏览器的工具来完成这项工作。

async
关键字放在函数前面只意味着这是一个异步函数。您需要在想要实际等待的函数之前包含关键字
wait
。就这样,

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

这只是我的一个项目中的例子(多余的代码在发布之前已被删除)

检查此异步代码并不意味着多线程,代码仍然在一个线程中运行。异步只是一种协作多任务,而不是多线程。@Ivar-现在大多数现代JS实现都支持一种线程形式。只是
async
关键字不是。浏览器有一个事件循环。调用异步函数时,该函数将被安排在下一个循环中运行,但仍然是单线程的。@behzadbesharati调用
async
函数不会安排执行。它将立即执行(正如您在本文中看到的)。返回的承诺在以后的状态下解析。很好,这一个对我有效。我不确定为什么会有效,因为无限循环仍将阻塞。函数前面的
async
有两个用途。1.它允许在函数中使用
wait
。2.它告诉调用方,保证此函数返回承诺。但是
async
wait
都不能神奇地解决阻塞问题。因此,如果
bcrypt.hash
中有一些阻塞代码,那么前面的
wait
将无法解决阻塞问题。删除
wait
并编写
async函数hashPin(pin){return bcrypt.hash(pin,salthards)。然后(hashedPin=>/*…*/)}
将不会对阻塞产生任何影响。你们是对的,我完全错过了关于无限循环的部分,只提供了如何使用异步函数的答案。我的错