2013-02-28 46 views
1

我是NodeJs的新手。這是我學習異步函數的代碼。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 

請解釋我。

回答

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"); 
+1

@ pfried的答案更好,因爲它不僅是異步的,而且是並行的(如果你有多個核心)。 – slebetman 2013-02-28 08:52:05

1

這是一個完全同步的代碼,因爲node.js是單線程的,所以不會以這種方式啓動第二個線程。

有幾個異步任務,如網絡請求或數據庫調用,但這不是。

你將不得不派生一個子進程來使這個異步。

有關更多信息,請參見http://nodejs.org/api/child_process.html

+0

非常感謝,我的困惑,我明白了。 – 2013-02-28 09:03:48