Saltar al contenido

Uso de bucles y promesas en transacciones en Sequelize

Tenemos la solución a este atascamiento, o por lo menos eso pensamos. Si presentas preguntas dínoslo y sin tardar

Solución:

Deberías usar un Promise.all

    var members = req.body.members;
    models.sequelize.transaction(function (t) 
        var promises = []
        for (var i = 0; i < members.length; i++) 
            var newPromise = models.User.create('firstname':members[i], 'email':members[i], 'pending':true, transaction: t);
           promises.push(newPromise);
        ;
        return Promise.all(promises).then(function(users) 
            var userPromises = [];
            for (var i = 0; i < users.length; i++) 
                userPromises.push(users[i].addInvitations([group], transaction: t);
            
            return Promise.all(userPromises);
        );
    ).then(function (result) 
        console.log("YAY");
    ).catch(function (err) 
        console.log("NO!!!");
        return next(err);
    );

no creo que necesites catch dentro de las transacciones secuenciales, ya que creo que salta a la captura de la transacción

Perdón por formatear. En movil.

Promise.all esperará a que todas las promesas regresen (o fallen) antes de ejecutar .then, y el .then la devolución de llamada serán todos los datos prometidos de cada array

Deberá usar las construcciones de bucle integradas de bluebird que se envían con Sequelize:

    var members = req.body.members;
    models.sequelize.transaction(t => 
      Promise.map(members, m => // create all users
        models.User.create(firstname: m, email: m, 'pending':true, transaction: t)
      ).map(user => // then for each user add the invitation
         user.addInvitations([group], transaction: t) // add invitations
    )).nodeify(next); // convert to node err-back syntax for express

Dependiendo de su implementación de Node.js, esto puede ayudar. Tengo la misma configuración usando express, POSTGRES y sequelize.

Personalmente, prefiero la implementación async/await (ES6) en lugar de then/catch, ya que es más fácil de leer. Además, la creación de una función que se puede llamar externamente mejora la reutilización.

async function createMemeber(req) 
let members = req.body.members;
  for (var i = 0; i < members.length; i++) 
    // Must be defined inside loop but outside the try to reset for each new member;
    let transaction = models.sequelize.transaction();
    try  
      // Start transaction block.
      let user = await models.User.create('firstname':members[i],  'email':members[i], 'pending':true, transaction);
      await user.addInvitations([group], transaction));

      // if successful commit the record. Else in the catch block rollback the record.
      transaction.commit();
      // End transaction block.
      return user;
     catch (error)  
      console.log("An unexpected error occurred creating user record: ", error);
      transaction.rollback();
      // Throw the error back to the caller and handle it there. i.e. the called express route.
      throw error;
    
  

Te mostramos reseñas y puntuaciones

Recuerda dar difusión a este artículo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *