To będzie trochę rozproszone, wybacz mi.
Po pierwsze, zakładając, że ten kod poprawnie używa interfejsu API sterownika mysql, oto jeden ze sposobów, w jaki można go otoczyć, aby działał z natywną obietnicą:
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
Więc jedno:nadal masz oddzwonienia. Wywołania zwrotne to po prostu funkcje, które przekazujesz do czegoś do wywołania w pewnym momencie w przyszłości z wybranymi przez niego argumentami. Więc argumenty funkcji w xs.map(fn)
, (err, result)
funkcje widoczne w węźle, wynik obietnicy i obsługa błędów są wywołaniami zwrotnymi. Jest to nieco zdezorientowane przez ludzi, którzy odnoszą się do określonego rodzaju wywołań zwrotnych jako „callbacks”, tych z (err, result)
używany w rdzeniu węzła w tak zwanym „stylu z przekazywaniem kontynuacji”, czasami nazywanym „węzłami zwrotnymi” przez osoby, które tak naprawdę ich nie lubią.
Przynajmniej na razie (async/await w końcu nadejdzie) utkniesz z wywołaniami zwrotnymi, niezależnie od tego, czy przyjmujesz obietnice, czy nie.
Ponadto zauważę, że obietnice nie są tutaj od razu, oczywiście pomocne, ponieważ nadal masz oddzwonienie. Obietnice naprawdę błyszczą tylko wtedy, gdy połączysz je z Promise.all
i obiecuję akumulatory a la Array.prototype.reduce
. Ale tak czasami świecą i są warte nauki.