同步编程和异步编程之间有什么区别(在node.js中)

JavaScript Node.js

老丝

2020-03-24

我一直在阅读nodebeginner, 并且遇到了以下两段代码。

第一个:

    var result = database.query("SELECT * FROM hugetable");
    console.log("Hello World");

第二个:

    database.query("SELECT * FROM hugetable", function(rows) {
       var result = rows;
    });
    console.log("Hello World");

我得到了他们应该做的事情,他们查询数据库以检索查询的答案。然后console.log('Hello world')

第一个应该是同步代码。第二个是异步代码。

这两件作品之间的区别对我来说很模糊。输出是什么?

搜寻异步编程也没有帮助我。

第3169篇《同步编程和异步编程之间有什么区别(在node.js中)》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

7个回答
米亚Eva 2020.03.24

同步功能正在阻塞,而异步功能没有。在同步函数中,语句在下一条语句运行之前完成。在这种情况下,如果按照其中一条语句花费的时间很长,则会按语句的顺序准确地评估程序,并暂停执行程序。

异步函数通常接受回调作为参数,并且在调用异步函数后立即在下一行继续执行。仅当异步操作完成并且调用堆栈为空时才调用回调。繁重的操作(例如从Web服务器加载数据或查询数据库)应异步进行,以便主线程可以继续执行其他操作,而不是阻塞直到完成该长的操作(对于浏览器,UI会冻结) 。

原始发布于Github:链接

番长Davaid 2020.03.24

该函数使第二个异步。

第一个强制程序在下一行可以继续之前,等待程序的每一行完成运行。第二条允许每条线同时(独立)运行。

允许异步或并发的语言和框架(js,node.js)对于需要实时传输的事物(例如,聊天,股票应用程序)非常有用。

凯十三 2020.03.24

这两种方法之间的区别如下:

同步方式: 它等待每个操作完成,之后才执行下一个操作。对于您的查询:console.log()直到&除非查询已完成执行以从数据库获取所有结果,否则命令将不会执行。

异步方式: 它从不等待每个操作完成,而是仅在第一个GO中执行所有操作。结果可用后,将处理每个操作的结果。对于您的查询:该console.log()命令将在Database.Query()方法之后立即执行虽然数据库查询在后台运行,并在完成检索数据后加载结果。

用例

  1. 如果您的操作没有像从数据库中查询大量数据那样繁重,则可以采用同步方式,否则采用异步方式。

  2. 您可以以异步方式向用户显示一些进度指示器,而在后台可以继续进行繁重的工作。这是GUI应用程序的理想方案。

TomPro 2020.03.24

首先,我意识到我在回答这个问题上很晚。

在讨论同步和异步之前,让我们简要看一下程序如何运行。

同步情况下,每个语句在下一个语句运行之前完成在这种情况下,将按照语句的顺序准确地评估程序。

这就是JavaScript中异步工作的方式。JavaScript引擎分为两部分,一部分用于查看代码并使操作排队,另一部分用于处理队列。队列处理发生在一个线程中,这就是为什么一次只能执行一个操作的原因。

当看到异步操作(如第二个数据库查询)时,将解析代码并将该操作放入队列中,但是在这种情况下,该操作完成时将注册一个回调以运行。队列中可能已经有很多操作。队列最前面的操作已处理并从队列中删除。处理完数据库查询的操作后,请求将发送到数据库,完成后将在完成时执行回调。此时,已“处理”了该操作的队列处理器将继续执行下一个操作-在这种情况下

    console.log("Hello World"); 

数据库查询仍在处理中,但console.log操作位于队列的最前面并得到处理。立即执行此同步操作,立即导致输出“ Hello World”。一段时间后,数据库操作完成,然后才调用并处理在查询中注册的回调,并将变量结果的值设置为行。

一个异步操作可能会导致另一个异步操作,此第二个操作将被放入队列中,当它到达队列的最前面时,它将被处理。调用用异步操作注册的回调是JavaScript运行时如何在完成时返回操作的结果。

知道哪个JavaScript操作是异步的一种简单方法是注意它是否需要回调-回调是在第一个操作完成时将执行的代码。在问题的两个示例中,我们只能看到第二种情况具有回调,因此这是两者的异步操作。由于处理异步操作结果的样式不同,因此并非总是如此。

要了解更多信息,请阅读诺言。承诺是可以处理异步操作结果的另一种方法。promise的好处是编码风格更像是同步代码。

许多库(例如节点“ fs”)为某些操作提供同步和异步样式。在操作花费时间不多且不常用的情况下(例如在读取配置文件的情况下),同步样式操作将产生易于阅读的代码。

老丝阿飞 2020.03.24

在同步情况下,直到SQL查询执行完毕,才会执行console.log命令。

在异步情况下,将直接执行console.log命令。之后,查询结果将通过“回调”功能存储。

西里Near 2020.03.24

主要区别在于异步编程,否则您不会停止执行。您可以在执行“请求”时继续执行其他代码。

十三L 2020.03.24

如果在两个示例中都添加一行,这将变得更加清楚:

var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");

第二个:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);
});
console.log("Hello World");

尝试运行这些命令,您会注意到第一个(同步)示例result.length将在“ Hello World”行之前打印出来。在第二个(异步)示例中,result.length将(最有可能)在“ Hello World”行之后打印。

这是因为在第二个示例中,database.query该脚本在后台异步运行,并且该脚本直接通过“ Hello World”继续运行。console.log(result.length)当数据库查询完成时才会执行。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android