sql >> Base de Datos >  >> RDS >> Mysql

Use la promesa para procesar el valor de retorno de MySQL en node.js

Esto va a estar un poco disperso, perdóname.

Primero, asumiendo que este código usa la API del controlador mysql correctamente, aquí hay una forma en que podría ajustarlo para que funcione con una promesa nativa:

function getLastRecord(name)
{
    return new Promise(function(resolve, reject) {
        // The Promise constructor should catch any errors thrown on
        // this tick. Alternately, try/catch and reject(err) on catch.
        var connection = getMySQL_connection();

        var query_str =
        "SELECT name, " +
        "FROM records " +   
        "WHERE (name = ?) " +
        "LIMIT 1 ";

        var query_var = [name];

        connection.query(query_str, query_var, function (err, rows, fields) {
            // Call reject on error states,
            // call resolve with results
            if (err) {
                return reject(err);
            }
            resolve(rows);
        });
    });
}

getLastRecord('name_record').then(function(rows) {
    // now you have your rows, you can see if there are <20 of them
}).catch((err) => setImmediate(() => { throw err; })); // Throw async to escape the promise chain

Así que una cosa:todavía tienes devoluciones de llamada. Las devoluciones de llamada son solo funciones que le entregas a algo para llamar en algún momento en el futuro con argumentos de su elección. Así que los argumentos de la función en xs.map(fn) , el (err, result) Las funciones que se ven en el nodo y el resultado de la promesa y los controladores de errores son todas devoluciones de llamada. Esto es algo confuso para las personas que se refieren a un tipo específico de devolución de llamada como "devoluciones de llamada", las de (err, result) se usa en el núcleo del nodo en lo que se llama "estilo de paso de continuación", a veces llamado "retroceso de nodo" por personas a las que realmente no les gustan.

Por ahora, al menos (async/await llegará eventualmente), estás bastante atascado con las devoluciones de llamadas, independientemente de si adoptas promesas o no.

Además, notaré que las promesas no son inmediatamente, obviamente, útiles aquí, ya que todavía tiene una devolución de llamada. Las promesas solo brillan cuando las combinas con Promise.all y prometa acumuladores a la Array.prototype.reduce . Pero ellos lo hacen brillan a veces, y son son vale la pena aprender.