Javascript 为什么不是';这不是异步的吗?

Javascript 为什么不是';这不是异步的吗?,javascript,node.js,asynchronous,io,callback,Javascript,Node.js,Asynchronous,Io,Callback,我正试着在nodeJS中获得我的回电。我以为我已经把它们弄下来了,直到我遇到了下面的例子: function async(callback) { for(var i = 0; i < 10; i++) { } callback(); } async(function() { console.log('Expected 2nd Printout'); }); console.log('Expected 1st Printout'); 函数异

我正试着在nodeJS中获得我的回电。我以为我已经把它们弄下来了,直到我遇到了下面的例子:

 function async(callback) {
    for(var i = 0; i < 10; i++) {
    } 
    callback();    
}


async(function() {
    console.log('Expected 2nd Printout');
});

console.log('Expected 1st Printout');
函数异步(回调){
对于(变量i=0;i<10;i++){
} 
回调();
}
异步(函数(){
console.log(“预期第二次打印输出”);
});
console.log(“预期第一次打印输出”);
我对节点和回调的理解是,在调用异步函数之后,当我们等待异步函数完成执行时,将打印“预期的第1次打印输出”,然后在异步函数完成时打印“预期的第2次打印输出”。然而,在执行这个简单的程序时,情况正好相反


我认为,因为这是一项处理任务,而不是异步函数等待文件或侦听网络响应的情况,所以程序是以过程方式而不是异步方式运行的?

可以使用process.nextTick()使函数异步。正式文件:

当前事件循环运行完成后,调用回调函数。这不是setTimeout(fn,0)的简单别名,它更有效。它在事件循环的后续计时触发任何附加I/O事件(包括计时器)之前运行

此外,还可以尝试在谷歌上搜索“了解Node.js事件循环”。有很多文章可以帮助您了解幕后发生的事情

运行以下代码:

function async(callback) {
    process.nextTick( function() {
        for(var i = 0; i < 10; i++) {
            console.log('i = ' + i);
        } 
        callback();
    });
}

async(function() {
    console.log('Expected 2nd Printout');
});

console.log('Expected 1st Printout');
函数异步(回调){
process.nextTick(函数(){
对于(变量i=0;i<10;i++){
console.log('i='+i);
} 
回调();
});
}
异步(函数(){
console.log(“预期第二次打印输出”);
});
console.log(“预期第一次打印输出”);

为什么您认为这是异步的?您只是传递函数并立即执行它。如何实现异步?我不知道node.js是否是这种情况,但Javascript本质上是单线程的。调用函数
async()
不会导致它在另一个线程中运行。此外,您的空
for
循环几乎肯定会通过抖动得到优化。