我是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
请解释一下。
答案 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");