Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utiliser la promesse pour traiter la valeur de retour MySQL dans node.js

Ça va être un peu dispersé, pardonnez-moi.

Tout d'abord, en supposant que ce code utilise correctement l'API du pilote mysql, voici une façon de l'encapsuler pour qu'il fonctionne avec une promesse native :

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

Donc une chose :vous avez encore des rappels. Les rappels ne sont que des fonctions que vous donnez à quelque chose à appeler à un moment donné dans le futur avec les arguments de son choix. Ainsi, les arguments de la fonction dans xs.map(fn) , le (err, result) les fonctions vues dans le nœud et le résultat de la promesse et les gestionnaires d'erreurs sont tous des rappels. Ceci est quelque peu confus par les personnes qui se réfèrent à un type spécifique de rappel en tant que "rappels", ceux de (err, result) utilisé dans le noyau du nœud dans ce qu'on appelle le "style de passage continu", parfois appelé "nodebacks" par des personnes qui ne les aiment pas vraiment.

Pour l'instant, au moins (async/wait arrive éventuellement), vous êtes à peu près coincé avec des rappels, que vous adoptiez ou non des promesses.

De plus, je noterai que les promesses ne sont pas immédiatement utiles ici, car vous avez toujours un rappel. Les promesses ne brillent vraiment que lorsque vous les combinez avec Promise.all et promettre des accumulateurs à la Array.prototype.reduce . Mais ils font brillent parfois, et ils sont mérite d'être appris.