2015-03-03 29 views
0

讓我來解釋一下我的問題。我有一個foreach循環和一個開關條件。在每個開關情況下,我將結果連接到一個全局數組。如何在nodejs中實現異步功能

var resultArray = []; 
Panels.forEach(function (panel, index) { 
switch(panel.CategoryId){ 
    case 'math': 
     resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); 
    break; 
    case 'physics': 
     resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); 
    break; 
    case 'zoology': 
     resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); 
    break; 
} 

return resultArray; 
}) 

但輸出不包含所有情況下的值。我知道它是因爲nodejs的異步性質。但是我們如何才能將這個功能實現爲異步?

任何想法將是明顯的

+0

是查詢之前或開關狀態後進行? – 2015-03-03 09:50:38

+0

@MatteoRubini查詢在案件情況下執行 – Manu 2015-03-03 09:55:52

回答

0

要創建一個類似的同步程序流程,您必須在您的設計中使用一個回調格局:

functionPerformingQuery(function(result){ 
    handleResult(result); 
}); 

主思路是:

  • 創建接受回調函數的函數
  • 當操作i時調用回調函數小號完成
  • 定義你的代碼中的回調函數可以訪問所有私有變量

更規範的方法是承諾()

https://www.promisejs.org/

0
在foreach循環

,沒有必要作爲回報。試試吧: var resultArray = []; Panels.forEach(function (panel, index) { switch(panel.CategoryId){ case 'math': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; case 'physics': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; case 'zoology': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; } }) console.log(resultArray);

0
在我看來

辯論,因爲在DB請求是異步,則需要執行結果使用承諾Jquery Promise

var resultArray = []; 
Panels.forEach(function (panel, index) { 
switch(panel.CategoryId){ 
    case 'math': 
     myDBfunction().then(function(result) { 
     resultArray = resultArray.concat(result); 
     }); 
    break; 
    case 'physics': 
     myDBfunction().then(function(result) { 
     resultArray = resultArray.concat(result); 
     }); 
    break; 
    case 'zoology': 
     myDBfunction().then(function(result) { 
     resultArray = resultArray.concat(result); 
     }); 
    break; 
} 

return resultArray; 
}) 

function myDBfunction() { 

    var deferred = new jQuery.Deferred(); 

    // do some with DB (not real code) 
    mysql.query("SELECT * ....", function(dbError, dbResult) { 
     deferred.resolve(dbResult); 
    }) 

    return deferred.promise() 
}