2014-03-30 142 views
0

我讀了如何在節點JS寫正確的代碼許多不同的文章後,越來越有點不高興了。節點JS代碼執行

我只是想澄清一些對我是否正確與否與這些語句:

  • 守則同步
  • 一個執行for循環或while循環等將異步執行
  • 通過這樣做下面的代碼是不妥當的異步:

大號

function doSomething(callback) { 
    // doing some code 

    // much much code 

    callback(); 
} 

,人們都在說,這將無法正常工作的原因是,代碼是異步執行的,因此回調將不會在它都將立即被執行的代碼的結尾被解僱了。

因此,例如,如果你做一些東西填補一些對象,你想後,充分對象返回通過回調這是行不通的,因爲它會在同一時間執行。

回答

1

node.js中的代碼不是標準的異步。一個接一個放置的呼叫仍會一個接一個地執行。 for或while循環仍然會以這種方式阻止主代碼。

但是,你可以繞過這將在後面執行,通過process.nextTick(回調)的功能。這個方法會爲事件隊列添加一個函數,node.js會在內部處理這個函數。這隻會在任何其他阻止代碼已被擴展後執行。一個例子:

function doWork(callback) { 
    //Do some work here, for instance a for loop that might take a while 

    callback(workReslt); 
} 

function workDone(workResult) { 
    //Process the result here 
} 

function startWork() { 
    process.nextTick(doWork(workDone)); 
} 

當服務器通過事件循環再次這將執行的doWork()。這樣,startWork()函數就不會阻塞主代碼。

然而,在node.js中大多數模塊已經實現了這一點。數據庫和文件訪問通常是非阻塞的,當它完成它的工作時,它將簡單地觸發回調。

如果你真的要執行大量異步計算(或者一些IO不已經有這方面的模塊),你可以看看異步模塊,它有一個很好的教程在這裏:http://justinklemm.com/node-js-async-tutorial/

至於編碼慣例,可以這樣想。如果您知道該操作需要時間,則應該使其異步(通過我先提及的方法或異步模塊)。類似這樣的操作通常與I/O相關,這通常也意味着已經有一個異步模塊。但是,我到目前爲止所遇到的大多數情況都沒有要求這樣做。

信息來源: http://howtonode.org/understanding-process-next-tick

2

沒有,forwhile循環是Node.js的同步

您的doSomething函數示例是否有效取決於在調用callback()之前是否正在調用異步函數。如果你正在進行異步調用,那麼你需要推遲調用callback(),直到這些異步調用完成。如果你只進行同步調用,那麼你不需要使用回調,你的函數可以同步返回結果。