これは少し散らばるでしょう、許してください。
まず、このコードがmysqlドライバーAPIを正しく使用していると仮定すると、ネイティブのpromiseで動作するようにラップする方法が1つあります。
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)
ノードに表示される関数とpromiseの結果およびエラーハンドラーはすべてコールバックです。これは、特定の種類のコールバックを「コールバック」、つまり(err, result)
のものと呼ぶ人々によって多少混乱しています。 ノードコアで「継続渡しスタイル」と呼ばれるもので使用されます。これは、あまり好きではない人からは「ノードバック」と呼ばれることもあります。
今のところ、少なくとも(async / awaitは最終的には来る)、promiseを採用するかどうかに関係なく、コールバックにかなり悩まされています。
また、コールバックがまだあるため、promiseはすぐには役に立たず、明らかにここでは役に立ちません。 Promiseは、Promise.all
と組み合わせた場合にのみ本当に輝きます。 Array.prototype.reduce
のアキュムレータを約束します 。しかし、彼らは 時々輝きます、そして彼らは 学ぶ価値があります。