我有一个问题,我正在导入一些数据,每个新行都依赖于之前添加的行(因为每一行都有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;
}
});
}