【问题标题】:Which parts in NodeJs are asynchronous and which parts are not?NodeJs 中哪些部分是异步的,哪些部分不是?
【发布时间】: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


【解决方案1】:

默认情况下 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 和计时器通常是非阻塞的,但这确实是阅读文档的情况。

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多