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ó.