我一直在读node初学者
我看到了下面两段代码。
第一个问题:
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')。
第一个应该是同步代码。
第二种是异步代码。
这两件作品之间的区别对我来说很模糊。输出是什么?
在谷歌上搜索异步编程也没什么用。
如果你在两个例子中都加上一行,这将变得更清楚:
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");
尝试运行这些程序,您将注意到第一个(同步)示例的结果。长度将在'Hello World'行之前打印出来。
在第二个(异步)示例中,结果。length将(很可能)打印在"Hello World"行之后。
这是因为在第二个例子中,数据库。查询在后台异步运行,脚本直接继续“Hello World”。console.log(result.length)只在数据库查询完成时执行。
JS中的异步编程:
同步
停止执行进一步的代码,直到完成此操作。
因为它停止了进一步的执行,同步代码被称为“阻塞”。阻塞是指没有其他代码将被执行。
异步
它的执行被延迟到事件循环中,这是JS虚拟机中的一个构造,它执行异步函数(在同步函数堆栈为空之后)。
异步代码之所以称为非阻塞代码,是因为它不会阻塞进一步的代码运行。
例子:
//该函数是同步的
函数日志(参数){
console.log (arg)
}
日志(1);
//该函数是异步的
setTimeout(() => {
console.log (2)
}, 0);
日志(3)
示例记录1、3、2。
2被记录在最后,因为它在一个异步函数中,该函数在堆栈为空后执行。