2015-12-22 32 views
0

我正在編寫一個調度程序,該程序返回有關課程的JSON數據。一個星期前我剛剛開始Node.js,所以我不確定我是否正確。 我正試圖找到更好的方式來編寫此代碼並避免回調地獄。我已經寫了getJSON方法。Node.js回調操作檢查

/*getJSON(course-name, callback(JSONretrieved)): gets JSON info about name and 
takes in a callback to manipulate retrieved JSON data*/ 

現在我想從課程數組中獲取多個課程名稱並檢查它們之間的時間衝突。然後我會將所有可行組合添加到答案數組中。我現在的想法是:

/*courseArray: array of classes to be compared 
answers: array of all nonconflicting classes*/ 
var courseArray = ['MATH-123','CHEM-123'] 
var answers=[] 
getJSON(courseArray[0],function(class1data){ 
    getJSON(courseArray[1],function(class2data){ 
     if(noConflict) answers.push(merge(class1data,class2data)) 
    }) 
    ) 
    }) 
); 

最後,訪問答案數組,我們從上面包住整個代碼:

function getAnswers(cb){ 
    /*courseArray: array of classes to be compared 
answers: array of all nonconflicting classes*/ 
var courseArray = ['MATH-123','CHEM-123'] 
var answers=[] 
getJSON(courseArray[0],function(class1data){ 
    getJSON(courseArray[1],function(class2data){ 
     /check for time conflicts between class1data and class2 data 
     if(noConflict(class1data,class2data)) answers.push(merge(class1data,class2data)) 
    }) 
    ) 
    }) 
); 
cb(answers) 
} 

,我們調用函數

getAnswers(function(ans){ 
    //do processing of answers 
    console.log(ans) 
}) 

我的主要問題是如果有什麼辦法可以使這段代碼更短,更具可讀性或更少回調hecky。

+2

在我看來,回調是好的,直到他們不是,你在地獄。那時候是學習承諾的時候了,或者使用[bluebird](https://github.com/petkaantonov/bluebird),[async](https://github.com/caolan/async)或[Q ](https://github.com/kriskowal/q)等 – adeneo

+0

是的,我完全同意。從同步思維模式(我主要是Java和PHP)轉換到異步模式非常刺激和不自然,所以我試圖通過自己編寫回調來強制自己學習。雖然 –

回答

0

您可以使用承諾庫讓自己更容易。如果用戶選擇一些以上的課程進行比較,那麼你的做法可能會很快失去控制。

的東西,如async,可以使parallel調用getJSON和你代碼將一個回調,一旦所有的getJSON調用已經返回內運行。您的代碼對於大型課程陣列將更具可讀性和可維護性。

+0

可能是使用承諾的時間謝謝。我一定會檢查異步。我一直在尋找藍鳥,但是讓我從藍鳥中離開的原因是我需要重寫當前的功能,以便它們能夠被普遍化。你認爲我應該爲藍鳥選擇異步嗎? –

+0

他們都是經過戰鬥考驗和維護良好的圖書館,所以我會說,去任何最容易融合! – Anchor