Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden Sie Promise, um den MySQL-Rückgabewert in node.js zu verarbeiten

Das wird ein wenig verstreut, verzeihen Sie mir.

Erstens, vorausgesetzt, dieser Code verwendet die MySQL-Treiber-API korrekt, ist hier eine Möglichkeit, ihn so zu verpacken, dass er mit einem nativen Promise funktioniert:

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

Also eins:Sie haben noch Rückrufe. Rückrufe sind einfach Funktionen, die Sie an etwas übergeben, um es irgendwann in der Zukunft mit Argumenten seiner Wahl aufzurufen. Also die Funktionsargumente in xs.map(fn) , der (err, result) Funktionen, die in node und dem Promise-Ergebnis und den Fehlerhandlern zu sehen sind, sind alle Callbacks. Dies wird etwas durch Leute verwirrt, die sich auf eine bestimmte Art von Rückrufen als "Rückrufe" beziehen, die von (err, result) Wird im Knotenkern im sogenannten "Continuation-Passing-Stil" verwendet, manchmal auch "Nodebacks" von Leuten genannt, die sie nicht wirklich mögen.

Zumindest im Moment (async/await kommt irgendwann) stecken Sie ziemlich fest mit Rückrufen, unabhängig davon, ob Sie Versprechungen annehmen oder nicht.

Ich werde auch darauf hinweisen, dass Versprechen nicht sofort, offensichtlich hilfreich sind, da Sie immer noch einen Rückruf haben. Versprechen glänzen erst richtig, wenn Sie sie mit Promise.all kombinieren und Promise-Akkumulatoren a la Array.prototype.reduce . Aber sie tun leuchten manchmal, und sie sind lernenswert.