Chuyện này sẽ hơi phân tán một chút, thứ lỗi cho tôi.
Đầu tiên, giả sử mã này sử dụng đúng API trình điều khiển mysql, đây là một cách bạn có thể kết hợp nó để hoạt động với một lời hứa gốc:
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
Vì vậy, một điều:Bạn vẫn có các cuộc gọi lại. Lệnh gọi lại chỉ là các hàm mà bạn đưa cho một thứ gì đó để gọi vào một thời điểm nào đó trong tương lai với các đối số do nó lựa chọn. Vì vậy, các đối số của hàm trong xs.map(fn)
, (err, result)
các hàm được thấy trong nút và kết quả hứa và trình xử lý lỗi đều là lệnh gọi lại. Điều này hơi gây nhầm lẫn bởi mọi người đề cập đến một loại gọi lại cụ thể là "gọi lại", loại của (err, result)
được sử dụng trong lõi nút trong cái gọi là "kiểu truyền tiếp tục", đôi khi được những người không thực sự thích chúng gọi là "nút lùi".
Hiện tại, ít nhất (async / await cuối cùng cũng đến), bạn đang gặp khá nhiều khó khăn với các lệnh gọi lại, bất kể bạn có chấp nhận lời hứa hay không.
Ngoài ra, tôi sẽ lưu ý rằng những lời hứa không phải là ngay lập tức, rõ ràng là hữu ích ở đây, vì bạn vẫn có một cuộc gọi lại. Lời hứa chỉ thực sự tỏa sáng khi bạn kết hợp chúng với Promise.all
và hứa với bộ tích lũy là Array.prototype.reduce
. Nhưng họ làm đôi khi tỏa sáng, và chúng là đáng học hỏi.