node.js非阻塞代码示例失败

时间:2013-11-25 12:05:12

标签: javascript node.js

关注此链接http://greenash.net.au/thoughts/2012/11/nodejs-itself-is-blocking-only-its-io-is-non-blocking/我正在尝试编写两个非阻塞函数:

阻止代码:

function LongBucle() {
    for (x=0;x<=10000;x++) {
        console.log(x);
    }
}

function ShortBucle() {
    for (x=0;x<=10;x++) {
        console.log("short "+x);
     }
}

LongBucle();
console.log("Long bucle end");

ShortBucle();
console.log("Short bucle end");

现在我尝试将代码转换为非阻塞代码,以便 “console.log(”Short bucle end“);”应该先显示?

function ShortBucle(callback) {
    for (x=0;x<=10;x++) {
        console.log("corto "+x);
    }
callback(x);
}


function LongBucle(callback) {
    for (x=0;x<=10000;x++) {
        console.log(x);
     }
     callback(x);
}


LongBucle(function(err) {
    console.log('Long bucle end');
});


ShortBucle(function(err) {
   console.log('short bucle end');
});

但它不起作用。我做错了什么?

1 个答案:

答案 0 :(得分:1)

添加回调不会使您的代码异步。由于Javascript是单线程语言,因此在给定时间只执行一条指令。这意味着无论您做什么,此片段都会永久挂起:

function a() {
    while (true) {}
}

a();
console.log('Done.');

要稍后处理一些代码(即异步),您可以使用process.nexTick()setImmediate

function LongBucle(callback) {
    setImmediate(function() {
        for (x=0;x<=10000;x++) {
            console.log(x);
         }
         callback(x);
    })
}

Here is an article解释process.nextTick()和Javascript中的事件循环。