为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

UYOU 2019-06-18 16:26:49
同步编程和异步编程(在node.js中)有什么区别?我一直在读初学者我发现了以下两段代码。第一项:    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').第一个应该是同步代码。第二个是异步代码。这两件作品之间的区别对我来说非常模糊。输出是什么?在异步编程上谷歌搜索也帮不了我。
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

不同之处在于第一个例子,程序将阻塞在第一行。下一行(console.log)将不得不等待。

第二个例子console.log将在处理查询时执行。也就是说,查询将在后台处理,而您的程序正在执行其他事情,一旦查询数据准备就绪,您将对它做任何您想做的事情。

因此,简单地说,第一个示例将阻止,而第二个示例则不会。

以下两个示例的输出:

// Example 1 - Synchronous (blocks)var result = database.query("SELECT * FROM hugetable");console.log("Query finished");console.log("Next line")
;// Example 2 - Asynchronous (doesn't block) database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");});console.log("Next line");

将是:

  1. Query finished
    Next line

  2. Next line
    Query finished


而Node本身单螺纹,有些任务可以并行运行。例如,文件系统操作发生在不同的进程中。

这就是Node可以执行异步操作的原因:一个线程正在执行文件系统操作,而主Node线程则一直在执行您的javascript代码。在像Node这样的事件驱动服务器中,文件系统线程通知主节点线程某些事件,如完成、失败或进度,以及与该事件相关的任何数据(例如数据库查询的结果或错误消息),主节点线程决定如何处理该数据。

你可以在这里读到更多关于这一点的信息:单线程非阻塞IO模型是如何在Node.js中工作的


查看完整回答
反对 回复 2019-06-18
?
呼唤远方

TA贡献1856条经验 获得超11个赞

这两种方法的区别如下:

同步方式:它等待每个操作完成,然后只执行下一个操作。用于查询:console.log()除非查询已完成执行以获得数据库的所有结果,否则将不会执行命令。

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

用例

  1. 如果您的操作不像查询来自DB的巨大数据那样需要进行非常繁重的工作,那么就继续使用同步方式,否则采用异步方式。

  2. 在异步方式下,您可以向用户显示一些进度指示符,而在后台,您可以继续您的重量级工作。这是GUI应用程序的理想场景。


查看完整回答
反对 回复 2019-06-18
?
开满天机

TA贡献1786条经验 获得超12个赞

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

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");

尝试运行这些程序,您将注意到第一个(同步)示例将在“HelloWorld”行之前打印出结果.Length。在第二个(异步)示例中,将(很可能)在“HelloWorld”行之后打印结果.Length(很可能)。

这是因为在第二个例子中,database.query在后台异步运行,脚本直接使用“HelloWorld”继续运行。这个console.log(result.length)只有在数据库查询完成时才执行。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 1022 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信