为什么异步循环在异步函数中时会被阻塞?

时间:2019-02-01 11:07:17

标签: javascript asynchronous async-await es6-promise

我不明白如何使用异步功能。

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

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

2 个答案:

答案 0 :(得分:7)

CIKernel关键字不会使同步代码异步,无法快速运行慢速代码或不阻塞代码。

它只是使函数返回一个promise,并提供(与async关键字一起)与其他promise进行交互的机制,就像同步。

您的函数开始循环,然后四处循环。

它没有到达函数的结尾,这将结束函数并解决它返回的承诺。

它没有到达await关键字并在等待已解决的诺言时暂停。

恰好不断旋转。

如果您实际上是在循环中,这在计算上是昂贵的,并且您想推入后台,那么您可以使用Node.js Worker Thread或浏览器-基于Web Worker来做到这一点。

答案 1 :(得分:-3)

在函数之前放置async关键字仅表示这是异步函数。您需要在实际上要等待的功能之前包括关键字await。就是这样:

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

那只是我的一个项目的示例(多余的代码在发布前已被删除)