我最近在修补节点 js 及其异步特性,并遇到了一些奇怪的事情。这是代码-let sum = 0;for(let i=0;i<10000000000;i++){ sum += i if(i==99999999){ console.log(sum); }}console.log('abc');根据非阻塞的定义,它不应该等待 for 循环结果,应该先打印'abc',然后在计算完成后打印 sum 的值,对吗?然而,这并没有发生,程序正在等待 for 循环完成并打印 sum 的值,然后打印“abc”。谁能解释这背后的原因?这是由于 console.log 的工作方式造成的吗?
2 回答

莫回无
TA贡献1865条经验 获得超7个赞
它对 IO 操作是非阻塞的,IO operations include file read write, network read write, database read write etc.
这是由事件循环控制的。
For 循环不是 IO 操作,但是如果你在 for 循环中有 IO 操作,你会得到非阻塞的味道。

茅侃侃
TA贡献1842条经验 获得超21个赞
Javascript 同步工作。异步工作的东西很少:
setImmediate
, setTimeout()
, 和诸如fetch()
,Promise.resolve()
等的承诺。
我还需要提到,来自例如的回调setTimeout
被添加到一个任务队列或也被命名为“回调队列”,并且它等待事件循环用它的同步代码完成。事件循环准备就绪后,它将获取此回调并将其添加到调用堆栈并执行该回调函数。并且此代码将同步执行。
实际上没有真正的并行性。为此你应该使用网络工作者。
添加回答
举报
0/150
提交
取消