Sarà un po' disperso, perdonami.
Innanzitutto, supponendo che questo codice utilizzi correttamente l'API del driver mysql, ecco un modo in cui puoi avvolgerlo in modo che funzioni con una promessa 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
Quindi una cosa:hai ancora delle richiamate. I callback sono solo funzioni che passi a qualcosa da chiamare in futuro con argomenti di sua scelta. Quindi gli argomenti della funzione in xs.map(fn)
, il (err, result)
le funzioni viste nel nodo e il risultato della promessa e i gestori degli errori sono tutte callback. Questo è alquanto confuso dalle persone che si riferiscono a un tipo specifico di richiamata come "richiamate", quelle di (err, result)
utilizzato in node core in quello che viene chiamato "stile di passaggio di continuazione", a volte chiamato "nodeback" da persone a cui non piacciono molto.
Per ora, almeno (async/await arriverà alla fine), sei praticamente bloccato con i callback, indipendentemente dal fatto che tu adotti le promesse o meno.
Inoltre, noterò che le promesse non sono immediatamente utili qui, poiché hai ancora una richiamata. Le promesse brillano davvero solo quando le combini con Promise.all
e promettono accumulatori alla Array.prototype.reduce
. Ma lo fanno brillano a volte e lo sono vale la pena imparare.