Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

190
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!