1

我是 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 秒,打印“>>>>4.335387639806787e+32”,然后打印“端点 2”

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

Endpoint 1

Endpoint 2

>>>>4.335387639806787e+32

请解释一下。

4

2 回答 2

1

这是一个完全同步的代码,并且由于 node.js 是单线程的,它不会以这种方式启动第二个线程。

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

您必须生成一个子进程才能进行此异步操作。

有关更多信息,请参见http://nodejs.org/api/child_process.html

于 2013-02-28T08:44:37.827 回答
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");
于 2013-02-28T08:50:44.297 回答