虽然我没有实际问题,但我需要解释一下在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操作是异步的吗?是否概述了什么是和不是或是否有一般原则?
答案 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和定时器通常是非阻塞的,但实际上是阅读文档的情况。