2012-05-21 92 views
0

我一直在閱讀示例應用程序嘗試學習節點。我注意到有幾個在boot()中加載模型和控制器時使用readdirSync方法。節點app.js - 同步讀取文件?

例如:

var models_path = __dirname + '/app/models' 
var model_files = fs.readdirSync(models_path) 
model_files.forEach(function(file){ 
    if (file == 'user.js') 
    User = require(models_path+'/'+file) 
    else 
    require(models_path+'/'+file) 
}) 

這似乎反節點給我。這與節點所喜歡的「嘗試製造一切異步」是相反的。

何時以及爲什麼同步文件讀取是這樣一個好主意?

+1

有沒有這樣的事情,「試圖使一切-async「,你總是使用目前對你來說很方便的工具。 – freakish

回答

3

更可能的是,使初始化更簡單 - 當速度的異步性不重要;我們並沒有試圖處理很多併發請求。同樣,如果您需要訪問某些在啓動時初始化的變量,這些變量將用於應用程序的生命週期,那麼您不需要在回調中包裝整個應用程序!

0

同步讀取需要當您必須確定所有數據在繼續之前都可用並且您需要按順序保留序列。換句話說,如果您需要阻止進程並且無法執行任何其他操作(例如,在您啓動服務器時(例如,爲HTTPS讀取證書文件))。

同步讀取可能是合意在其他時間保持編碼更簡單,如Len建議。但是,如你所建議的那樣,你的表現簡單易行。事實上,在這種情況下最好使用衆多的測序輔助程序庫之一。通過照顧嵌套的回調和序列問題,這些大大簡化了代碼。

當然,您作爲示例提供的代碼相當危險 - 如果讀取失敗會發生什麼情況?

這裏有圖書館3:

  • Streamline.js允許你寫異步JS/CoffeeScript的,就好像是同步。只需用'_'替換回調。但是你要麼編譯你的腳本,要麼通過加載器運行它們。
  • async - 似乎是關於最好的想法和記錄,並建議由幾個建立了真實世界的應用程序的人。
  • async.js - 可鏈接的,暴露FS以及(包括READDIR,walkfiles,水珠,ABSPATH,複製,RM - 專注於FS而不是一般的

這個鏈接也可能是使用的:The Tale of Harry - 的解釋神話般的程序員是如何從傳統編程轉向基於回調的&他最終使用的模式,以及異步庫中呈現的模式的有用洞察