Това ще бъде малко разпръснато, извинете.
Първо, ако приемем, че този код използва правилно API на драйвера на mysql, ето един начин, по който можете да го обвиете, за да работи с оригинално обещание:
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
И така, едно нещо:все още имате обратни повиквания. Обратните извиквания са просто функции, които предавате на нещо, което да извикате в някакъв момент в бъдещето с аргументи по негов избор. И така, аргументите на функцията в xs.map(fn)
, (err, result)
функциите, които се виждат в възел и резултатът от обещанието и манипулаторите на грешки са всички обратни извиквания. Това е донякъде объркано от хората, наричащи конкретен вид обратно извикване като "обратни извиквания", тези на (err, result)
използва се в ядрото на възела в това, което се нарича „стил на преминаване на продължаване“, понякога наричан „обратни възли“ от хора, които всъщност не ги харесват.
Поне засега (в крайна сметка async/await идва), вие сте почти останали с обратни извиквания, независимо дали приемате обещания или не.
Също така ще отбележа, че обещанията не са веднага, очевидно полезни тук, тъй като все още имате обратно повикване. Обещанията наистина блестят само когато ги комбинирате с Promise.all
и обещаващи акумулатори като Array.prototype.reduce
. Но те правят блестят понякога и те са струва си да се научи.