【问题标题】:understand non-blocking in node.js理解 node.js 中的非阻塞
【发布时间】:2014-06-26 02:30:37
【问题描述】:

为了在 nodejs 中理解非阻塞,我编写了如下代码:循环数组中的元素,对于每个元素,在记录元素之前“休眠”一段时间。预计所有 console.log 都应该非常接近地执行,因为它没有被睡眠阻塞,但实际上不是:这里哪里出错了?

var data = [];
for (var i = 0; i <= 100; i++) {
    data.push(i);
}

function sleep(milliSeconds, callback) {
    var startTime = new Date().getTime();
    while (new Date().getTime() < startTime + milliSeconds);
}

var print = function(content) {
    sleep(1000, function(){
        callback();
    });
    console.log(String(content) + ': ' + String((new Date()).getTime()));
};

for (var item in data) {
    print(item);
}

【问题讨论】:

  • 呃,你的sleep函数阻塞了???
  • 什么是callback?为什么它从来没有被调用?为什么不使用setTimeout
  • 所有 javascript 执行在 node.js 中都是阻塞的,其他的可以是 fs.readFileSync 但不一定是 fs.readFile。您的代码示例都是 javascript 执行,因此都是阻塞的。
  • 感谢@Bergi,之前我认为使用睡眠来假装该功能是一项耗时的任务,基于此我试图了解node.js中的非阻塞
  • node.js 中的非阻塞通常意味着“耗时但异步”。您需要使用异步的 api。

标签: javascript node.js asynchronous


【解决方案1】:

sleep 方法中的 while 循环被阻塞。 NodeJS 有一个 built in method 。此外,您需要在回调内部登录,而不是在睡眠呼叫之后立即登录。更新后的代码可能如下所示:

    var data = [];
    for ( var i = 0; i <= 100; i++ ) {
        data.push( i );
    }

    var printContent = function( content ) {
    //use built-in method to run function after 5000 milliseconds
        setTimeout( function() {
            console.log( String( content ) + ': ' + String( ( new Date() ).getTime() ) );
        }, 5000 );
    };

    //different way to loop over an array, better than var...in for the Array type
    data.forEach( function( item ) {
        printContent( item );
    } );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多