使用Sails.js处理Waterline中的Q Promises的好方法

时间:2014-08-09 22:12:32

标签: node.js sails.js q waterline

我有一个问题,我正在导入一些数据,每个新行都依赖于之前添加的行(因为每一行都有order属性根据当前最大order来自其他对象设置。流程是我首先尝试查找具有相同名称的对象,如果没有找到,我首先检查最大order并使用该查询中的订单+ 1创建新对象。 我尝试使用水线下可用的Q承诺执行此操作。我尝试使用all方法,并将查询与Q docs中的then结合起来:

var result = Q(initialVal);
funcs.forEach(function (f) {
    result = result.then(f);
});
return result;

但是所有对象都具有相同的order,就像它们将被并行执行一样,而不是等待第一个链完成。

我终于找到了一个带有重复性的解决方案,但我怀疑这是使用promises的最佳方式。这是有效的代码(+需要一些重构和清理等),以显示粗略的想法:

function findOrCreateGroup(groupsQuery, index, callback) {
      var groupName = groupsQuery[index];

      Group.findOne({ 'name' : groupName }).then(function(group) {
        if (!group) {
           return Group.find().limit(1).sort('order DESC').then(function(foundGroups) {
               var maxOrder = 0;
               if (foundGroups.length > 0) {
                   maxOrder = foundGroups[0].order;
               }

               return Group.create({
                   'name' : groupName,
                   'order' : (maxOrder + 1)
               }).then(function(g) {
                 dbGroups[g.name] = g;

                 if (index + 1 < groupsQuery.length) {
                   findOrCreateGroup(groupsQuery, index + 1, callback);
                 } else {
                   callback();
                 }

                 return g;
               });
            });
        } else {

          dbGroups[group.name] = group;

          if (index + 1 < groupsQuery.length) {
            findOrCreateGroup(groupsQuery, index + 1, callback);
          } else {
            callback();
          }

          return group;
        }
      });
    }

0 个答案:

没有答案