Ezequiel hace 6 años
Mareo con las promesas
Hola amigos,
estoy armando un API con nodejs y tengo que hacer una operación "anidando" otras operaciones mas y devolver una respuesta.
El camino sería asi:
1. Creo una orden
2. Con el ID de la orden guardo los items
3. Con la orden completa guardo la transaccion
4. Guardo los datos del cliente
En mis modelos ya tengo armadas las funciones con promises para agregar cada uno de estos puntos.
En route tengo algo asi:
```javascript
/* POST a Order */
.post('/', (req, res, next) => {
let checkout = {};
models.Order.addOrder(req.body)
.then((result) => {
res.send(result);
})
.catch((err) => {
res.status(400).send(err);
});
})
```
Luego tengo:
```javascript
models.OrderItems.addItem(arrayItems,orderID)
models.Transac.addTransac(ObjectTransac)
models.Customer.addCustomer(ObjectCustomer)
```
Los tres devuleven promesas.
El tema es que me mareo de como armar la llamada a las 4 operaciones y que en la ultima me devuelva un objeto con todas las respuestas de cada uno de estos métodos.
Desde ya, les agradezco de antemano su ayuda.
Responder 4 respuestas
Ezequiel hace 6 años...
Bueno, segui haciendo pruebas y me quedó asi:
```javascript
.post('/', (req, res, next) => {
let checkout = {};
models.Order.addOrder(req.body)
.then((result) => {
checkout.order = result;
return models.OrderItems.addOrderItems(req.body.items, result.data.id);
})
.then((result) => {
checkout.items = result;
return models.Donnors.addDonnor(req.body);
})
.then((result) => {
checkout.donnor = result;
return models.Transac.addTransac(checkout.order);
})
.then((result) => {
checkout.transac = result;
res.status(200).send(checkout);
})
.catch((err) => {
console.log(err);
res.status(400).send(err);
});
})
```
Con eso funcionó.
¿Es la manera de hacer este tipo de operaciones o hay alguna otra forma mejor de hacerlo?
Gracias
Hola que tal Ezequiel, este patrón de encadenamiento de promesas que describes en la literatura lo referencian como **"accumulator pattern" ** que es básicamente tener un objeto inicial donde irás "acumulando" las respuestas de cada promesa.
Hay personas que son bastante puristas y no les agrada tanto este patrón, en mi caso lo considero bueno y muy fácil de leer y comprender.
Otra forma sería regresar un arreglo con las respuestas previas de cada promesa; sin embargo a mi parecer eso se vuelve más complicado de leer.
Así que **yo me quedo con como lo has hecho en este ejemplo**.
Saludos.
Ezequiel hace 6 años...
Muchas gracias Alex por tu pronta respuesta.
Me ha ayudado tu video donde tratas el tema de las promesas con Javascript para resolverlo.
Mi gran duda estaba en como manejar cada llamado para que se ejecuten en la secuencia deseada.
Saludos y nuevamente muchas gracias
Ah perfecto, que bien que te sirvió ese material. Seguimos en contacto.
Saludos.
Por favor inicia sesión para participar en esta pregunta