es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener todos los valores de retorno de una transacción que contiene múltiples consultas – knex.js

Estoy tratando de actualizar varias filas a la vez.

Estoy esperando a que todas las consultas sean escritas antes de ejecutarlas todas en una sola consulta. Sin embargo, necesito que algunos valores sean devueltos por la consulta después de la actualización. Para eso, estoy utilizando el método returning().

No logro obtener todos los valores devueltos a la vez como un arreglo después de que se haya ejecutado la consulta. Si uso un then() directamente en la función de transacción, devuelve los valores devueltos uno por uno y mi promesa no funcionará. También aumenta considerablemente el tiempo de ejecución.

¿Cómo puedo obtener todos los valores devueltos de mi solicitud de actualización a la vez en una lista?

return await knex.transaction(trx => {
    const queries = [];
    data.forEach(pair => {
        const query = knex('pair')
            .where('symbol', pair.s)
            .update({
                last_price: pair.c,
            })
            .returning(['id'])
            .transacting(trx);
        queries.push(query);
    });

    return Promise.all(queries)
        .then(() => { 
            trx.commit(); 
        })
        .catch((e) => {
            trx.rollback(); 
            console.error(e);
        }); 
})
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los valores de retorno de la solicitud de actualización de una vez en una lista, puedes utilizar el método Promise.all() para esperar a que todas las consultas se ejecuten y resuelvan. Luego, puedes mapear el arreglo resultante para extraer los valores de retorno y combinarlos en un solo arreglo utilizando el operador spread. Aquí está el fragmento de código modificado:

    return await knex.transaction(trx => {
        const queries = [];
        data.forEach(pair => {
            const query = knex('pair')
                .where('symbol', pair.s)
                .update({
                    last_price: pair.c,
                })
                .returning(['id'])
                .transacting(trx);
            queries.push(query);
        });
    
        return Promise.all(queries) // Una vez que se hayan escrito todas las consultas
            .then(results => {
                const returningValues = results.map(result => result[0]);
                trx.commit();
    
                return returningValues; // Devuelve la lista de valores de retorno
            })
            .catch(e => {
                trx.rollback();
                console.error(e);
            });
    });
    

    Con esta modificación, el método Promise.all() espera a que todas las consultas se ejecuten y resuelvan. El arreglo resultante de los resultados es luego mapeado para extraer el primer valor de retorno de cada resultado. Finalmente, el operador spread combina todos los valores de retorno en un solo arreglo, que es devuelto por la transacción.

Comments are closed.