2015-04-03 108 views
1

我正在調用REST API來更新sails中的數據庫條目。 因此,我有一個迭代JSON數組的函數,併爲每個條目調用另一個將值保存到數據庫中的函數。Waterline中的並行寫入訪問

function getData(){ 
for(index in apiJson){ 
    saveData(apiJSON[index]); 
} 
} 

在saveData函數中,我使用waterline的.findOrCreate功能。如果沒有這樣的條目,則創建新條目。這一切都很好。但是現在我想將新創建的條目(Table:match)中的id添加到另一個表(表:團隊)中的數組(matches)。由於JavaScript的異步行爲,我得到了一些失敗。

我實現(短)如下所示:

Match.findOrCreate({..},{..}).exec(function(err,match){ 
    ... 
    //if match was just created in db 
    if(newMatch){ 
     Team.findOrCreate({apiID: someTeamID}), 
     { 
     ... 
     ..., 
     matches: [] 
     } 
    ).exec(function(err,team){   
     team.matches.push(someID); 
     team.save(function(err,s){ 
     ...   
     }); 
     }); 
    } 
}); 

由於JavaScript的執行這段代碼異步我得到我的模特隊隊的重複條目。另外我的陣列matches在模型Team中並不符合我在其他模型Match中的值。

我該如何排序數據庫寫入訪問以防止此行爲?是否有可能讓循環並行運行,但數據庫是否以串行方式更新?

回答

1

Sails.js提供異步爲global variable,你可以用它做像以下

async.series([ 
    function(callback) { 
     callback(null, 'data1'); 
    }, 
    function(callback){ 
     //handle data 
     callback(null, 'data2'); 
    } 
], function(err, results) { 
     res.send(results.data1 + results.data2); 
}); 
序列化操作