Обновление в цикле в петлевом узле JS - PullRequest
0 голосов
/ 19 мая 2018

В loopback мне нужно обработать Patch in loop.Всякий раз, когда я пытаюсь пропатчить свойство, мне может потребоваться обновить свойство в одной или во всех других записях таблицы / коллекции.Я использовал before save hook и вызывал 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 для каждого действия обновления в цикле.Как это можно решить?

1 Ответ

0 голосов
/ 19 мая 2018

Такое поведение определенно ожидается, если вы сделаете ваш оператор приращения легко распознаваемым, вы можете запретить ему вызывать себя.

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});
        }
    }
}
...