NodeJS - 无法实现异步功能

时间:2013-02-28 08:20:30

标签: node.js asynchronous

我是NodeJs的新手。这是我学习异步函数的代码。

//--------------------- MAIN ---------------
console.log("Endpoint 1\r\n");

testThread(1000000000,function (result){
    console.log(">>>>"+result+"\r\n");
});

console.log("Endpoint 2\r\n");

//------------------------------------------


function testThread(data,callback) {    
    //take a long time
    for(j=0;j<data;j++) {
        a = 122342342342424242431*3543652636364;
    }
    //          
    callback(a);
}

运行它:

node testthread.js

总是结果是:

Endpoint 1

>>>>4.335387639806787e+32

Endpoint 2

系统打印“端点1”,需要2秒,打印“&gt;&gt;&gt;&gt; 4.335387639806787e + 32”然后打印“端点2”

我在这里找不到异步。 它应该是:

Endpoint 1

Endpoint 2

>>>>4.335387639806787e+32

请解释一下。

2 个答案:

答案 0 :(得分:1)

这是一个完全同步的代码,因为node.js是单线程的,所以不会以这种方式启动第二个线程。

有几个异步任务,如网络请求或数据库调用,但这个不是。

您必须生成子进程才能使其异步。

有关详细信息,请参阅http://nodejs.org/api/child_process.html

答案 1 :(得分:1)

异步函数是调用异步其他函数的函数。没有其他方法可以在javascript / node.js中实现异步函数。这起初看起来像鸡和鸡蛋的问题不是吗?如果要求是必须调用另一个异步函数以便异步,那么如何编写异步函数呢?

答案是必须在C中实现最低级别的异步函数。

幸运的是,javascript / node.js有几个用C实现的内置异步函数,我们可以将它们用作javascript中的构建块来构建我们自己的异步函数。此类函数的示例包括http.request()方法,socket.listen()方法以及最简单的setTimeout()setInterval()

以下是一个如何重写代码以实现异步处理的示例;

function long_task (repeat_number, callback) {
    // setTimeout is asynchronous, so keep calling it until we're done

    function loop () {
        if (repeat_number > 0) {
            repeat_number --;
            setTimeout(loop,1);
        }
        else {
            callback("I'm done!");
        }
    }

    loop();
}

console.log("calling long task");
long_task(10000,function(x){console.log(x)});
console.log("long task started");