【问题标题】:Parallel write access in WaterlineWaterline 中的并行写访问
【发布时间】:2015-04-03 00:13:42
【问题描述】:

我正在调用一个 REST API 来更新我在sails 中的数据库条目。 因此,我有一个函数可以遍历 JSON 数组,并为每个条目调用另一个函数,该函数将值保存到数据库中。

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

在 saveData 函数中,我使用水线中的 .findOrCreate 功能。如果没有这样的条目,则创建一个新条目。这一切都很好。但是现在我想将新创建的条目(表:匹配)中的 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 异步执行此代码,我在模型 Team 中获得了重复的团队条目。此外,我在模型 Team 中的数组 matches 与我在其他模型 Match 中的值不对应。

我怎样才能序列化数据库写访问以防止这种行为?是否有可能让循环并行运行但数据库串行更新?

【问题讨论】:

    标签: javascript node.js sails.js waterline


    【解决方案1】:

    Sails.js 提供 async 作为 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);
    });
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2014-12-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多