NodeJ中哪些部分是异步的,哪些部分不是?

时间:2017-11-06 20:06:55

标签: javascript node.js asynchronous

虽然我没有实际问题,但我需要解释一下在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

由于NodeJ是异步的,我原本期望结果是“First Second Third”。但是,以下代码是异步的:

console.log("First")
setTimeOut(function(){
    console.log("Third")
}, 3000)

console.log("Second")

输出是:     第一     第二     第三

问题是我不完全理解为什么。是因为while循环是阻塞的,即使我把它放在一个函数中?如果是这样,还有什么是阻塞的,什么不是?它与事件循环有关吗?只有I / O操作是异步的吗?是否概述了什么是和不是或是否有一般原则?

1 个答案:

答案 0 :(得分:0)

默认情况下,JS / Node.js语言是同步的(如果你愿意,可以阻塞) - 和大多数编程语言一样 - ,因为这些代码行是一个接一个地执行的,这就是为什么第一个例子的输出是“First”,“Third”,“Second”。

console.log("First");  // Outputs "First"

pause(3000);           // Outputs "Third"

console.log("second"); // Outputs "Second"

那就是pause()只是一个被同步调用和执行的函数;没什么特别的。

在第二个例子中,语言事件驱动模型已经通过setTimeout()使用,它接受一个回调函数作为在计时器到期时调用的参数。这意味着输出序列不同。

所以回答你的问题:标准JavaScript代码是同步的,但许多标准库函数都是非阻塞的。如果相应地编写,你的确可以。

哪个标准库函数?好的I / O和定时器通常是非阻塞的,但实际上是阅读文档的情况。