这是我正在尝试的一些代码:

startTask();

function startTask(){
    console.log('startTask enter');
    startLongTask(1, function(){
        console.log('long task complete');
    });
    console.log('startTask exit');
}

function startLongTask(i, callback) {
    while (i++ < 10000){
        console.log(i);
    }
    callback();
}


这是输出(省略数字上的大数列):

startTask enter
2
3
4
5
6
7
8
9
10
long task complete
startTask exit


显而易见,如果我运行了很长时间,那么它是同步的。就像在startTask中内联startLongTask一样。我如何解决此回调是非阻塞的。我期望的输出是:

startTask enter
startTask exit
2
3
4
5
6
7
8
9
10
long task complete

最佳答案

纯Javascript代码无法在纯JS中创建新的异步操作,因为node.js中的V8解释器无法为您提供完整的线程。

诸如node.js中的fs模块之类的库从本机操作(在JS / V8世界之外)获得其异步行为,并使用异步接口与JS引擎接口。

也就是说,有一些方法可以通过使用一些非JS代码在node.js中在后台运行操作。您可以开始另一个过程,可以使用支持其他执行线程的各种附加模块,等等。所有这些都将在纯node.js Javascript之外,以提供异步接口。

如果您的任务可以分成几小段,您还可以通过在连续的计时器上进行少量工作来模拟异步操作(这也是浏览器中的常见解决方法)。

10-06 00:16