Tôi đã xem xét thư viện felixge / node-mysql và không thấy tham chiếu đến lệnh client.connect trong API. Đây có phải là cuộc gọi thực sự mà bạn đang cố gắng thực hiện (không cố tỏ ra khó hiểu ở đây)? Bất kể IMHO, bạn cần phải suy nghĩ thêm về cách Javascript được thiết kế, bởi vì nó sử dụng một mô hình lập trình khác với hầu hết các ngôn ngữ phổ biến khác.
Vấn đề đầu tiên tôi thấy trong mã của bạn là bạn chưa xác định lệnh gọi lại, vì vậy nó không thực sự tồn tại. Tôi giả sử console.log (callback) là không xác định. Từ mã của bạn, hàm ẩn danh là 'gọi lại' cho hàm client.connect. Bạn phải xác định những gì bạn đang gọi là 'gọi lại' ở phạm vi cao hơn. Ví dụ, tôi sẽ định nghĩa một hàm myCallback tồn tại trong phạm vi cao hơn hàm ẩn danh của client.connect. Có thể hữu ích khi tra cứu phạm vi biến Javacscript .
var myCallback(err, response) {
if (err) {
console.log('err:%s',err);
} else {
console.log('response:%s',response);
}
}
client.connect(err, function(response) {
// this anonymous function is the callback to client.connect, the var
// 'callback' would be undefined.
if (err) {
myCallback(err);
return; // Explicit call to return, else the lines below would run.
}
myCallback(null, response);
});
Thứ hai, nếu bạn không gọi hàm return một cách rõ ràng trong Javascript, thì hàm sẽ tiếp tục xử lý. Tôi đã bị cắn bởi chính mình . Cuối cùng, Javascript chạy một vòng lặp hướng sự kiện có nghĩa là nó sẽ không bao giờ đợi các hàm trả về giá trị, đó là lý do tại sao chúng ta có tất cả các lệnh gọi lại này ngay từ đầu. Bạn có thể buộc Javascript hoạt động khác, ví dụ bằng cách sử dụng vòng lặp while cho đến khi một điều kiện là đúng. Xem thư viện 'async' theo caolan , để biết các chiến lược khác nhau về thao tác vòng lặp sự kiện. Bất lợi lớn khi lạm dụng các phương pháp này là bạn thực sự lãng phí chu kỳ / chặn CPU khi bạn có thể nên sử dụng nhiều lệnh gọi lại hơn và chỉ đơn giản là nghĩ lại cách chương trình của bạn hoạt động.