Javascript Nodejs实际上是异步的吗?

Javascript Nodejs实际上是异步的吗?,javascript,node.js,express,Javascript,Node.js,Express,我看到了这篇文章:,在运行代码之后,我确认nodejs是异步的。 然而,我创建了2个js文件来再次测试nodejs的异步特性 文件1:callback\u example.js exports.countless = function(callback){ var date = new Date(); console.log("*" + date.getSeconds()); var x = 0; for(var i = 1; i <= 1000000000

我看到了这篇文章:,在运行代码之后,我确认nodejs是异步的。 然而,我创建了2个js文件来再次测试nodejs的异步特性

文件1:callback\u example.js

exports.countless = function(callback){
    var date = new Date();
    console.log("*" + date.getSeconds());
    var x = 0;
    for(var i = 1; i <= 1000000000; i++){
        x++;
    }
    callback(x);
    date = new Date();
    console.log("**" + date.getSeconds());
}

exports.check = function(callback){
    var date = new Date();
    console.log(date.getSeconds());
    callback(123);
    date = new Date();
    console.log(date.getSeconds());
}
var call = require('./callback_example');

call.countless(function(x){
    console.log(x);
});

call.check(function(x){
    console.log(x);
});

当我在终端中执行call.js作为
节点调用
时,我看到在无数()完成后,,然后检查()运行。这意味着nodejs是synchronus?为什么?谁能帮我回答这个问题?多谢各位

节点本身不是异步的,它只是使用事件循环作为主要构造。事件循环的迭代是同步执行的,就像任何其他编程语言一样

这里的示例根本不使用异步代码。仅仅因为某个东西在回调中并不一定意味着它是异步的(例如,
map
将是异步的)。这里只使用高阶函数

试着把这两个都放在单独的
setTimeout
s中;调用顺序将不受保证

节点保证从运行到完成(也就是说,任何函数都将被完全执行,除非它在第一个
return
语句之前抛出),因此任何同步代码都将按照其编写的顺序执行,就像任何其他命令式语言一样。但是,任何I/O操作或类似使用
承诺的操作都会将它们的回调添加到任务队列中,以便在将来的某个时候执行,因此它们的执行顺序无法保证


请注意,NodeJS是单线程的,而大型
for
循环会消耗掉单线程,因为这是一个CPU限制的操作,所以在执行此类计算量大的操作时要小心,因为这样会挂起整个应用程序。对于计算量大的内容,您可以使用另一种更适合这种情况的语言编写的子进程(使用
子进程
模块)。

节点本身不是异步的,它只是使用事件循环作为主要构造。事件循环的迭代是同步执行的,就像任何其他编程语言一样

这里的示例根本不使用异步代码。仅仅因为某个东西在回调中并不一定意味着它是异步的(例如,
map
将是异步的)。这里只使用高阶函数

试着把这两个都放在单独的
setTimeout
s中;调用顺序将不受保证

节点保证从运行到完成(也就是说,任何函数都将被完全执行,除非它在第一个
return
语句之前抛出
),因此任何同步代码都将按照其编写的顺序执行,就像任何其他命令式语言一样。但是,任何I/O操作或类似使用
承诺的操作都会将它们的回调添加到任务队列中,以便在将来的某个时候执行,因此它们的执行顺序无法保证


请注意,NodeJS是单线程的,而大型
for
循环会消耗掉单线程,因为这是一个CPU限制的操作,所以在执行此类计算量大的操作时要小心,因为这样会挂起整个应用程序。对于计算量大的内容,您可以使用另一种更适合这种情况的语言编写的子进程(使用
child\u进程
模块)。

node.js使用V8 Javascript引擎,它一行一行地执行Javascript同步。如果您在问题中的
无数
检查
方法中都编写了顺序编码语句,那么这些语句就像在其他编程语言中一样同步执行

下面是来自的node.js描述的一部分

Node.js使用事件驱动的非阻塞I/O模型,使其 重量轻,效率高

我认为,这比仅仅说node.js是异步的要好,因为它更好地描述了它的实际功能

在node.js中,只有使用某些外部接口(如网络)的真正异步操作才是非阻塞的。在这种情况下,调用non-blocking函数将启动操作,然后Javascript将继续执行下一行Javascript。当非阻塞操作在将来某个时间完成时,事件将插入到事件队列中,并且当V8引擎完成当前执行线程的执行时,可以从事件队列中提取该事件并调用回调

您不能用纯Javascript从头开始编写真正的异步操作(实际代码在后台执行)。您需要外部接口(如网络、文件I/O等)的帮助才能创建实际的异步操作。你可以用定时器来模拟一个,但这实际上不是异步的,因为没有任何东西在后台执行。计时器只是改变事情运行的时间(它们实际上并不与Javascript执行并行工作)

下面是node.js中异步操作的示例:

var fs = require('fs');

console.log("one");
fs.readFile('temp.txt', function(err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log("got data");
    }
});
console.log("two");
这将生成以下输出:

one
two
got data

fs.readFile()
操作实际上是异步的。调用它之后,它在后台工作,而后面语句中的其余Javascript继续执行。当它完成时,在将来的某个时候,它将调用它的回调函数,返回错误或数据。

node.js使用v8javascript引擎,并一行一行地执行Javascript同步。如果您在问题中的
无数
检查
方法中都编写了顺序编码语句,那么这些语句就像在其他编程语言中一样同步执行

下面是来自的node.js描述的一部分