Bạn nói rằng file2 / 3 là "nội dung giống nhau" nhưng chúng không nằm trong một khu vực quan trọng. Theo tài liệu của Bluebird cho promisifyAll
(xem http://bluebirdjs.com/docs/api/promise.promisifyall.html), tính năng này tạo ra một ...Async
phiên bản của từng chức năng cốt lõi trong ứng dụng khách Redis. Bạn gọi hmgetAsync
trong trường hợp đầu tiên của bạn, nhưng bạn chỉ gọi hmget
trong những người khác của bạn.
Điều này quan trọng vì bạn đang sử dụng mẫu không đồng bộ nhưng có cấu trúc mã không đồng bộ. Trong file2 / 3, bạn đặt result1
bên trong một lệnh gọi lại không đồng bộ, nhưng sau đó trả lại nó bên dưới mỗi cuộc gọi trước khi cuộc gọi có thể quay trở lại.
Bạn có hai lựa chọn:
1:Bạn có thể chuyển đổi file2 / 3 / etc thành một mẫu hoàn toàn truyền thống bằng cách truyền lệnh gọi lại bên cạnh ứng dụng khách redis:
module.exports = function(redisclient, callback){
Thay vì trả về result1
, sau đó bạn sẽ gọi lệnh gọi lại với giá trị này:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:Bạn có thể chuyển đổi file2 / 3 / .. N thành dựa trên Promise, trong trường hợp đó, bạn không cần phải promisifyAll(require(...))
chúng - bạn có thể chỉ cần require()
họ. Mẫu như vậy có thể trông giống như:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
Đây là một tùy chọn đơn giản và gọn gàng hơn nhiều, và nếu bạn tiếp tục với nó, bạn có thể thấy rằng bạn thậm chí có thể loại bỏ yêu cầu () và chỉ cần thực hiện hmgetAsync
trong file1 với dữ liệu thích hợp do Cassandra trả về. Nhưng thật khó để biết nếu không nhìn thấy nhu cầu ứng dụng cụ thể của bạn. Trong mọi trường hợp, các mẫu dựa trên Promise thường ngắn hơn và rõ ràng hơn nhiều, nhưng không phải lúc nào cũng tốt hơn - có chi phí hiệu suất vừa phải để sử dụng chúng. Đó là cuộc gọi của bạn theo cách bạn đi - một trong hai cách sẽ hoạt động.