sql >> Database teknologi >  >> RDS >> Mysql

Brug løfte til at behandle MySQL-returværdi i node.js

Det her bliver lidt spredt, tilgiv mig.

For det første, forudsat at denne kode bruger mysql-driver-API'en korrekt, her er en måde, hvorpå du kan indpakke den til at fungere med et indbygget løfte:

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

Så én ting:Du har stadig tilbagekald. Tilbagekald er bare funktioner, som du giver noget til at kalde på et tidspunkt i fremtiden med argumenter efter eget valg. Altså funktionsargumenterne i xs.map(fn) , (fejl, resultat) funktioner set i node og løfteresultatet og fejlbehandlere er alle tilbagekald. Dette er noget forvirret af folk, der omtaler en bestemt type tilbagekald som "tilbagekald", dem af (fejl, resultat) brugt i node core i det, der kaldes "fortsættelsespasserende stil", nogle gange kaldet "nodebacks" af folk, der ikke rigtig kan lide dem.

For nu, i det mindste (async/await kommer til sidst), sidder du stort set fast med tilbagekald, uanset om du vedtager løfter eller ej.

Jeg vil også bemærke, at løfter ikke er umiddelbart, naturligvis nyttige her, da du stadig har et tilbagekald. Løfter skinner først rigtigt, når du kombinerer dem med Promise.all og lover akkumulatorer a la Array.prototype.reduce . Men de gør skinner nogle gange, og de er værd at lære.



  1. Hvordan får man kun numeriske kolonneværdier?

  2. Loop over en indsættelsesforespørgsel i PHP

  3. Opret en bruger med alle rettigheder i Oracle

  4. Hentning af data fra flere tabeller til en enkelt række, mens nogle værdier sammenkædes