在环回中我需要处理Patch in循环。
每当我尝试修补属性时,我可能必须更新表/集合中的一个或所有其他记录中的属性。我一直在使用before save
挂钩并调用updateInLoop
,如下所示更新其他记录。
module.exports = function(Model) {
Model.observe('before save', async(ctx, next) => {
if(ctx.Data) {
updateInLoop(ctx.Data, Model);
}
});
}
const updateInLoop = async function(data, Model) {
var modelDbData = await Model.find();
for(let entity in modelDbData) {
if(entity.property > threshold){
entity.property = entity.property + 1;
await Model.upsert(model);
}
}
}
如果updateInloop
中的循环不能运行多次,这似乎工作正常。每当循环需要运行多次时,代码似乎没有按预期工作。
我发现意外行为是由于循环中的每个更新操作都执行了before save
挂钩。怎么解决这个问题?
答案 0 :(得分:0)
这种行为是绝对可以预期的,如果你可以轻松识别你的增量语句,你可以阻止它自己调用。
module.exports = function(Model) {
Model.observe('before save', async(ctx) => {
// if(ctx.Data) {
let keys = ctx.Data ? Object.keys(ctx.Data) : undefined;
// It is an increment if the length of its keys is 1 and that the key is property
let isIncrement = (keys && keys.length === 1 && keys[0] === 'property');
if (ctx.Data && !isIncrement) {
updateInLoop(ctx.Data, Model);
}
});
}
const updateInLoop = async function(data, Model) {
var modelDbData = await Model.find();
for(let entity in modelDbData) {
if(entity.property > threshold){
// entity.property = entity.property + 1;
// await Model.upsert(model);
await Model.updateById(entity.id, {property: entity.property + 1});
}
}
}