2011-04-17 110 views
1

我發現很難得到JS回調概念。我知道這是一個等待被其父母稱呼的功能網絡,但這有什麼優勢? nodejs如何不被阻塞?請問下列問題肯定會給「你好世界」還是它可能是第一個被稱爲? nodejs是否切換上下文,因爲它如何超越等待被回調的函數?我明白這個問題沒有很好的組織,因爲我很困惑,更多的信息只是評論。javascript/nodejs概念

SomeProccess(function() { 
    print("hello"); 
}); 

OtherProccess(function() { 
    print("world"); 
); 
+0

讓我推薦[node.js SO聊天](http://chat.stackoverflow.com/rooms/642/node-js)進行模糊問題和一般性討論 – Raynos 2011-04-17 00:09:27

回答

3

這完全取決於代碼是阻塞的還是非阻塞的。

如果代碼被阻塞,則SomeProcess將執行某些操作,然後調用打印「hello」的函數。如果它是非阻塞的,這意味着它將控制權傳遞給子流程,或者將消息傳遞給流,然後在消息返回時再做一些其他事情。

// Blocking 
function SomeProcess(cb) { 
    for (var i = 0; i < 10; i++) { 
     ... 
    } 
    cb(); 
} 

// Non blocking 
function SomeProcess(cb) { 
    process.nextTick(cb); 
} 

如果函數被阻塞,那麼你可以發出命令。如果沒有阻塞,那麼沒有攝像頭。

非阻塞:

  • process.nextTick
  • 的setTimeout/setInterval的
  • child_process.spawn

在Node.js的,你可以假定所有IO是非阻塞的。 node.js內部有一個阻塞工作的隊列。 (調用函數),一旦完成了工作,它將返回到事件循環並捕獲一組新的阻塞工作,該工作要麼處理來自流的傳入消息,要麼處理超時或處理process.nextTick事件。

有一點要注意的是,EventEmitter.emit是阻塞,它會立即解決所有綁定的事件處理程序。

+0

因此,nodejs中的大部分代碼實際上被阻塞爲我懷疑它把它交給子進程?糾正我,如果我錯了:/ – Will03uk 2011-04-17 00:18:04

+0

@ Will03uk流。很多都是通過流來完成的。打開一個文件流,打開一個HTTP流,網絡流等。所有的IO都阻止了特定的「同步」版本的方法。你自己編寫的大部分代碼都會被阻塞。 – Raynos 2011-04-17 00:19:16