2016-04-10 57 views
0

我是node.js的新手。 我已經在研究如何在google上運行node.js線程循環(事件循環)以外的代碼,但無法獲得答案。在node.js線程循環外部運行代碼

我如何創建一個運行在節點事件循環之外的函數。 例如,在貓鼬,它使用

scheme.save(function(err)){ 
    console.log('saved'); 
}); 

插入數據,其中節點運行插入代碼(保存功能)的外部事件循環,然後返回到事件循環運行我的回調(在上面的示例中,在做一些日誌記錄)。

我嘗試

function getUser(id, callback) { 
    setTimeout(function() { 
     console.log('executed'); 
     callback(null, "jhon"); 
    }, 5000); 
    } 

    function display(err,user) { 
     console.log(user); 
    } 

    getUser(432, display); 
    console.log('this show first'); 

但它同步運行(它阻止的事件循環5第二新請求被處理之前)。

我該如何實現相同的'保存'功能,所以它不會在上面的代碼中阻塞事件循環5秒? 任何主題閱讀? 謝謝。

+0

爲什麼你認爲它阻止事件循環? –

+0

請閱讀更新的問題。 我嘗試在2個分開的選項卡上運行上面的代碼。並且在第一個'jhon'日誌出現後記錄第二個日誌'this show first'。是iam做錯了嗎? – gitong0315

+0

它打印出類似這樣: 「這個節目第一」 「JHON」 「本次車展第一」 「JHON」 代替 '本次車展第一 本次車展第一 約翰 john' – gitong0315

回答

0

正如@SteveCampbell所說 - 你錯了,假設setTimeout(function() { /// }, 5000)將BLOCK事件循環 - 它不會。 它會只是延遲執行功能內的代碼5秒。在這5秒內,NodeJS引擎完全可操作,可以執行其他操作,接收和發送網絡請求並執行任何其他I/O。

enter image description here 檢查上的NodeJS事件循環性質和方式對這些資源進行正確的使用它:

UPD

「代碼像獲取rss數據」 - 再次只創建任務並添加任務完成時執行的回調。它不會阻塞任何東西,這是NodeJS異步代碼背後的主要優點。 這裏檢查example rss reader in NodeJS

//1 - task configuration 
var req = request('http://somefeedurl.xml') 
    , feedparser = new FeedParser([options]); 

// here while rss is being retrieved in a separate sub task 
// nodejs engine can do other tasks 

//2- callback for error 
req.on('error', function (error) { 
    // handle any request errors 
}); 
//2- callback for response with data 
req.on('response', function (res) { 
//... 
+0

請閱讀更新的問題。我嘗試在2個分離的選項卡上運行上面的代碼。並且在第一個'jhon'日誌出現後記錄第二個日誌'this show first'。 \t 它打印出如下內容:「this show first」「jhon」「this show first」「jhon」而不是「this show first」「this show first」「john」「john」 – gitong0315

+0

如果在getUser函數中iam做一些長時間運行的代碼,如獲取rss數據?它會阻止它的事件循環還是自動爲我創建新流程?這是真正的問題。 settimeout只是我的方法來模擬長時間運行的代碼 – gitong0315

+0

檢查更新的答案 – shershen