Có ít nhất hai vấn đề trong mã này:
-
cái đầu tiên được liên kết với quản lý đóng Javascript. Phần thân của vòng lặp không tạo phạm vi. Với Javascript, phạm vi của các biến là ở cấp hàm, không phải cấp khối. Bạn cần phải giới thiệu một số hàm trong chính vòng lặp để thực thi việc tạo một bao đóng thích hợp. Thông tin thêm tại đây.
-
cái thứ hai là điều kiện chạy đua giữa các lệnh tồn tại và thiết lập. Nếu bạn có một số kết nối Redis đang chạy tồn tại và đặt lệnh trên cùng một phím, bạn có thể sẽ gặp một số loại xung đột. Thay vì sử dụng tồn tại và thiết lập, bạn nên sử dụng setnx thực hiện kiểm tra và thiết lập trong một hoạt động nguyên tử.
Xem xét ví dụ thứ hai của bạn, sự cố đóng đã được khắc phục bằng cách sử dụng forEach, nhưng bạn vẫn tạo tất cả các hoạt động get trước các hoạt động đã đặt do tính chất không đồng bộ của ngôn ngữ.
Nếu bạn thực sự muốn trình tự tất cả các hoạt động get và set của mình (sẽ chậm hơn nhiều so với btw), thì bạn có thể sử dụng một chút lập trình chức năng để triển khai vòng lặp bằng cách sử dụng đệ quy.
Ví dụ :
Chương trình này:
var redis = require('redis')
var rc = redis.createClient(6379, 'localhost');
var tags = [
"apple",
"tiger",
"mouse",
"apple",
"apple",
"apple",
"tiger",
"mouse",
"mouse",
];
var count = 0;
function loop(tags) {
function rec_loop(tags,i) {
if ( i >= tags.length )
return
rc.get("tag:"+tags[i],function(err,rr) {
console.log("get tag "+tags[i]+" result code "+rr);
if ( rr == null ) {
rc.set("tag:"+tags[i],"info",function(err,rr) {
count++;
console.log('set tag '+tags[i]+' '+rr+' objects count '+count);
rec_loop(tags,++i)
})
} else
rec_loop(tags,++i)
})
}
rec_loop(tags,0)
}
loop(tags)
hiển thị:
get tag apple result code null
set tag apple OK objects count 1
get tag tiger result code null
set tag tiger OK objects count 2
get tag mouse result code null
set tag mouse OK objects count 3
get tag apple result code info
get tag apple result code info
get tag apple result code info
get tag tiger result code info
get tag mouse result code info
get tag mouse result code info
Lưu ý rằng điều kiện chủng tộc vẫn có trong ví dụ này. Bạn phải sử dụng setnx để thực hiện loại hoạt động kiểm tra và thiết lập này.