2013-07-09 148 views
-2

我有一個服務器上運行的node.js代碼,並想知道它是否阻塞或不。這是一種類似於此:下面的node.js代碼是阻塞的還是非阻塞的?

function addUserIfNoneExists(name, callback) { 
    userAccounts.findOne({name:name}, function(err, obj) { 
     if (obj) { 
      callback('user exists'); 
     } else { 

      // Add the user 'name' to DB and run the callback when done. 
      // This is non-blocking to here. 
      user = addUser(name, callback) 

      // Do something heavy, doesn't matter when this completes. 
      // Is this part blocking? 
      doSomeHeavyWork(user); 
     } 
    }); 
}; 

一旦addUser完成doSomeHeavyWork功能運行,並最終放置東西回來到數據庫中。這個函數需要多長時間並不重要,但它不應該阻塞服務器上的其他事件。

那麼,是否有可能測試node.js代碼是否結束阻塞?

+6

你問是否doSomeHeavyWork塊?我們如何在沒有看到該函數的代碼的情況下回答? –

回答

1

一般來說,如果它到達另一個服務,如數據庫或web服務,那麼它是非阻塞的,你需要有某種回調。然而,任何函數都會阻塞,直到返回什麼東西(即使沒有任何內容)...

如果doSomeHeavyWork函數是非阻塞的,那麼很可能無論您使用哪種庫都允許某種回調。所以,你可以寫函數接受回調,像這樣:

var doSomHeavyWork = function(user, callback) { 
    callTheNonBlockingStuff(function(error, whatever) { // Whatever that is it likely takes a callback which returns an error (in case something bad happened) and possible a "whatever" which is what you're looking to get or something. 
    if (error) { 
     console.log('There was an error!!!!'); 
     console.log(error); 
     callback(error, null); //Call callback with error 
    } 
    callback(null, whatever); //Call callback with object you're hoping to get back. 
    }); 
    return; //This line will most likely run before the callback gets called which makes it a non-blocking (asynchronous) function. Which is why you need the callback. 
}; 
+0

謝謝。這意味着我需要以非阻塞的方式編寫'doSomeHeavyWork'。 – psiphi75

+0

@ psiphi75不一定,請參閱我的編輯。 – kentcdodds

1

應避免在您的Node.js代碼同步塊的任何部分不調用系統或I/O操作和計算需要很長時間(在計算機意義上),例如迭代大數組。而是將這種類型的代碼移動到單獨的工作人員,或者使用process.nextTick()將其分成更小的同步部分。你可以找到解釋process.nextTick()here,但也讀取所有評論。