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)
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.