Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

200
Visualizações
Nodejs asíncrono sobrescribiendo valores con knex

Estoy tratando de guardar varios registros en la base de datos usando asíncrono, pero siempre termino en un registro sobrescribiendo a otros.

Aquí está mi lógica:

 var deferred = q.defer(); var records = [{emp_id:1, got_bonus: true},{emp_id:2, got_bonus: false},{emp_id:3, got_bonus: true}]; async.each(records, function(record, next){ saveRecord(record) .then(){ next(null); }); }, function(){ deferred.resolve(); }); function saveRecord(record){ record['activity_type'] = 'bonus'; db_module.save(record); } db_module.js ---------------- function saveRecord(record){ var deferred = q.defer(); checkDuplicate(record) .then(function(isDuplicate)){ if(!isDuplicate){ knex('employees').insert(record); deferred.resolve(); } }); } } function checkDuplicate(record){ return knex('employees') .where({'emp_id': record['emp_id']}) .then(function(rows){ return rows && rows.length > 0; }); }

Mi problema es que incluso usando async, el código no está esperando que se guarde el primer registro y luego se guarda a continuación. El resultado del código anterior en la tabla de la base de datos es:

 emp_id got_bonus ------- ---------- 3 true 3 false 3 true

la salida esperada es:

 emp_id got_bonus ------- ---------- 1 true 2 false 3 true

Intenté usar async.waterfall pero recibí el mismo error. No sé cómo usar el módulo de sincronización.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

¿Por qué no guarda sus datos de one shot vez?

 var records = [ {emp_id:1, got_bonus: true}, {emp_id:2, got_bonus: false}, {emp_id:3, got_bonus: true} ]; var modifiedRecords = records.map((i) => { return Object.assign({}, i, { activity_type : 'bouns', }) }); knex('employees') .insert(modifiedRecords) .then(()=> { /// sent response })
over 4 years ago · Santiago Trujillo Relatório

0

Resolví este problema cambiando async.each a async.eachSeries así:

 async.eachSeries(records, function(record, next){ saveRecord(record) .then(){ next(null); }); }, function(){ deferred.resolve(); });

eachSeries es igual que each pero ejecuta solo una única operación asíncrona a la vez.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda