我一直在读节点初学者我遇到了以下两段代码。
第一个:
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')
.
第一个应该是同步代码。
第二个是异步代码。
这两件作品之间的区别对我来说非常模糊。输出会是什么?
谷歌搜索异步编程也没有帮助我。
不同之处在于,在第一个例子,程序将阻塞在第一行。下一行(console.log
)将不得不等待。
In the 第二个例子, the 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");
将会:
-
Query finished
Next line
-
Next line
Query finished
Note
虽然 Node 本身是单线程,有一些任务可以并行运行。例如,文件系统操作发生在不同的进程中。
这就是 Node 可以执行异步操作的原因:一个线程正在执行文件系统操作,而主 Node 线程则继续执行您的 javascript 代码。在像 Node 这样的事件驱动服务器中,文件系统线程向主 Node 线程通知某些事件,例如完成、失败或进度,以及与该事件关联的任何数据(例如数据库查询的结果或错误)消息),主节点线程决定如何处理该数据。
您可以在这里阅读更多相关内容:单线程非阻塞 IO 模型在 Node.js 中的工作原理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)