Det här kommer att bli lite spretigt, förlåt mig.
För det första, förutsatt att den här koden använder mysql drivrutins-API på rätt sätt, här är ett sätt du kan slå in den så att den fungerar med ett inbyggt 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å en sak:Du har fortfarande återuppringningar. Återuppringningar är bara funktioner som du lämnar till något för att anropa någon gång i framtiden med argument som du själv väljer. Så funktionsargumenten i xs.map(fn)
, (err, result)
funktioner som ses i nod och löftesresultat och felhanterare är alla callbacks. Detta är något förvirrat av människor som hänvisar till en specifik typ av återuppringning som "återuppringningar", de av (err, result)
används i nodkärna i vad som kallas "fortsättningspasserande stil", ibland kallad "nodebacks" av personer som inte riktigt gillar dem.
För nu, åtminstone (async/await kommer så småningom), har du ganska mycket fastnat med callbacks, oavsett om du antar löften eller inte.
Jag noterar också att löften inte är omedelbart, uppenbarligen till hjälp här, eftersom du fortfarande har en återuppringning. Löften lyser först när du kombinerar dem med Promise.all
och lovar ackumulatorer a la Array.prototype.reduce
. Men de gör lysa ibland, och de är värt att lära sig.