Javascript 同步与异步节点

Javascript 同步与异步节点,javascript,node.js,Javascript,Node.js,假设我有一个在NodeJS中运行的示例代码 function (){ ///OPERATION 1 ///OPERATION 2 } 考虑到所有操作都不需要任何类型的超时,默认情况下javascript会同时运行两个,还是先完成操作1,然后完成操作2 在同一进程中,没有两行JavaScript同时运行。永远 看 Node.js中的异步代码(假设不涉及工作进程)始终以并发方式运行,而从不以并行方式运行。并发更易于编程,并帮助我们快速构建复杂的机器。为了“扩展”,您可能需要引入工

假设我有一个在NodeJS中运行的示例代码

 function (){
   ///OPERATION 1

   ///OPERATION 2

}

考虑到所有操作都不需要任何类型的超时,默认情况下javascript会同时运行两个,还是先完成操作1,然后完成操作2

在同一进程中,没有两行JavaScript同时运行。永远

Node.js中的异步代码(假设不涉及工作进程)始终以并发方式运行,而从不以并行方式运行。并发更易于编程,并帮助我们快速构建复杂的机器。为了“扩展”,您可能需要引入工作进程来并行工作

在您的示例中,如果两个操作都是同步的,则它们将按写入顺序运行(
1
2
)。事实上,如果操作
1
是同步的,则无论发生什么情况,它都将首先运行。如果两者都是异步的,那么您的体验取决于它们各自完成所需的时间!如果操作
1
是异步的,但操作
2
是同步的,则它们似乎以相反的顺序运行(
2
1
)。这与函数在上的调度方式有关,因此理解这一点将有助于理解这一切


深呼吸。是潜水的时候了


需要明确的是,在现实中,代码行总是按顺序执行的。我们没有,JavaScript引擎也不会神秘地跳转到不同的地方。要理解的关键是,当有人说一个函数是异步的时,它实际上也是部分同步的某些事情正在同步发生。否则它将是一个空函数。相反,它只是意味着只有一小部分工作是同步完成的,通常只是将工作安排在以后,然后剩余的工作再进行

因此,当我在上面说,如果它们都是异步的,那么“视情况而定”,这仅仅是该函数的完成或结果(通过回调或调用体验),其顺序相对于其他异步函数的完成是未定义的。完全同步函数的情况并非如此,因为同步函数的世界停止了

如果您有两个函数都试图从两个不同的来源检索相同的数据,一个是从硬盘检索,另一个是从internet检索,那么哪一个先完成?如果它们都是异步的,那么这是一个技巧性的问题。也许硬盘速度更快,但不要把你的生命押在它上面。不过,从技术上讲,他们中的一个会先同步被踢出局

这种将事情安排到以后,在继续之前不等待结果(非阻塞)的范例是Node.js即使没有工作进程/并行性也能获得如此优异性能的方法之一。特别是对于I/O,例如从磁盘读取文件,存在“静默期”的不活动状态,进程无事可做。在这种情况下,在继续之前等待是一种巨大的时间浪费。在这段时间内,利用这一机会交错其他功能更为合适。异步函数就是这样做的。他们推迟工作,让我们可以交叉进行其他工作。通常他们通过或来实现这一点

综上所述,生活中没有什么是自由的。延迟工作是有代价的,如果你误用定时器,你会减慢你的程序。目标是使所有不可避免的延迟(如I/O)都是异步的,而几乎没有其他延迟。然而,异步行为“污染了堆栈”。任何使用异步函数的东西本质上都是异步的。您可以同步返回一个值,并假装不是这样(使其对外部世界不可见),但这通常是一个坏主意,因为这样您就根本无法传播错误或结果


如果您仍然对如何查看程序和确定何时运行所有程序感到困惑,请查看。这是一种很好的编写异步代码的方法,它看起来更像传统的同步代码。它将到达节点7。

操作1,然后操作2如果两个操作都是异步的。。。他们将按顺序开始。但是,他们的大部分工作(实际的I/O等)将并行完成,并且他们可以按任意顺序完成(调用回调)。@JonathanLonowski-由于节点js(和大多数引擎)是单线程的,因此任何事情都不能并行完成。@niry JavaScript代码不能并行运行,但是工作的完全本机部分——实际读取文件内容、查询数据库中的记录等,都是用C/C++编写的(如Node.js)——可以使用额外的线程。@JonathanLonowski同意。操作“异步”意味着什么?@Dillybar,您知道它是何时启动的,也不知道什么时候能完工。它可能是1毫秒,1小时或永远不会。您不希望代码等待,因为正如前面提到的,在得到结果之前,用JS编写的所有东西(在该应用程序中)都将被冻结。因此,当您收到响应/结果时,您可以使用回调来得到通知,并处理该结果(只要该结果可用)。@Thomas,非常感谢!那么同步操作呢?什么时候结束?有什么区别吗?@Dillybar,它们也会立即启动,只要完成就可以运行。在此期间,JS不能做任何其他事情(单线程)。它只是执行代码;逐行,从左到右。@Thomas,那么在查看代码时,我如何区分这两种类型?例如,Mongoose查询是异步的,但我不知道这一点