我一直在阅读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')。
console.log('Hello world')
第一个应该是同步代码。第二个是异步代码。
这两件作品之间的区别对我来说非常模糊。输出会是什么?
谷歌搜索异步编程也没有帮助我。
不同的是,在第 一个示例 中,程序将在第一行阻塞。下一行 ( console.log) 将不得不等待。
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");
将会:
Query finished Next line
Query finished
Next line
Next line Query finished
注意 虽然 Node 本身是 单线程 的,但有些任务可以并行运行。例如,文件系统操作发生在不同的进程中。
这就是 Node 可以执行异步操作的原因:一个线程正在执行文件系统操作,而主 Node 线程继续执行您的 javascript 代码。在像 Node 这样的事件驱动服务器中,文件系统线程通知主 Node 线程某些事件,例如完成、失败或进度,以及与该事件相关的任何数据(例如数据库查询的结果或错误消息)并且主节点线程决定如何处理该数据。
您可以在此处阅读有关此内容的更多信息:Node.js 中单线程非阻塞 IO 模型的工作原理