【发布时间】:2018-04-19 02:01:00
【问题描述】:
虽然我没有遇到实际问题,但我需要解释一下是什么让 NodeJs 中的标准 Javascript 中的某些东西变得异步。以这段代码为例:
function pause(ms) {
var dt = new Date()
while((new Date()) - dt <= ms) {
}
console.log("Third")
}
console.log("First")
pause(3000)
console.log("second")
输出是
First
Third
second
由于 NodeJs 是异步的,我原本预计结果是“First Second Third”。然而,以下代码是异步的:
console.log("First")
setTimeOut(function(){
console.log("Third")
}, 3000)
console.log("Second")
输出是: 第一的 第二 第三个
问题是我不完全明白为什么。是因为 while 循环被阻塞了,即使我把它放在一个函数中?如果是这样,还有什么是阻塞的,什么不是?它与事件循环有关吗?只有 I/O 操作是异步的吗?是否概述了什么是什么,什么不是,或者是否有一般原则?
【问题讨论】:
-
一般是IO和系统操作,比如访问文件系统。有数以千计的 Node API,所以总的来说这个问题太宽泛了。
-
这与javascript相当相关。通常,所有带有回调和承诺的东西都是异步的。
-
感谢您的回答。这个问题与 NodeJs 中的基本 Javascript 有关。我不打算包括所有第三方或本地 API。 vanilla Javascript 中甚至还有一些异步的东西吗?
-
所以不要仅仅因为你原来的 pause() 函数需要一段时间才能完成就认为它是异步的。不是,只是需要一段时间才能完成。但它不涉及回调,如 setTimeOut(function(),...) 处理方式不同 - 查看事件循环和回调函数。
-
@Piepongwong 因为它不能。该函数不会添加到回调队列中,而是立即执行并且在返回之前无法继续。回调延迟和稍后执行的唯一方法是将其添加到回调队列中,例如使用 setTimeout 或 setImmediate。
标签: javascript node.js asynchronous