2016-09-07 38 views
0

我有一個像下面這樣的循環沒有按預期執行。Redis在Nodejs for循環無法正常工作

var redis = require('redis'); 
var client = redis.createClient(); 
var arr = [{title:"title1"},{title:"title2"},{title:"title3"},{title:"title4"}]; 
for(var i =0; i<arr.length; i++){ 
//console.log(arr[i]); 
var obj1 = arr[i]; 
client.get(obj1.title, function(err, response){ 
if(err){ 
    console.log(err); 
} 
if(response){ 
    if(i%3==0){ 
    client.del(obj1.title); 
    }else{ 
    client.incr(obj1.title); 
    } 
}else{ 
    client.set(obj1.title, 1); 
} 
}); 
} 

上運行下面的代碼的輸出之後是

for(var i=0; i<arr.length; i++){ 
client.get(arr[i].title, redis.print); 
} 

輸出:

Reply: null 
Reply: null 
Reply: null 
Reply: null 
Reply: null 
Reply: null 
Reply: 2 

這是不是我所期待的,因爲所有的值,除了一個被3整除應至少1;

回答

1

請創建一個新函數。在新功能中,您可以刪除,增加或創建新密鑰。

下面的代碼適合我。請檢查。

var redis = require('redis'); 
var client = redis.createClient(); 
var arr = [ { 
    title : "title1" 
}, { 
    title : "title2" 
}, { 
    title : "title3" 
}, { 
    title : "title4" 
} ]; 


function delOrIncr(obj1, i) { 
    client.get(obj1.title, function(err, response) { 
     if (err) { 
      console.log(err); 
     } 
     if (response) { 
      if (i % 3 === 0) { 
       console.log('Deleting >' + obj1.title); 
       client.del(obj1.title); 
      } else { 
       console.log('Increment >' + obj1.title); 
       client.incr(obj1.title); 
      } 
     } else { 
      console.log('Creating new >' + obj1.title); 
      client.set(obj1.title, 1); 
     } 
    }); 
} 

for (var i = 0; i < arr.length; i++) { 
    delOrIncr(arr[i], i); 

} 

注: -

請運行Get作爲一個單獨的程序檢查上述程序的結果。

1
var redis = require('redis'); 
var client = redis.createClient(); 
var arr = [{title:"title1"},{title:"title2"},{title:"title3"},{title:"title4"}]; 
for(var i =0; i<arr.length; i++){ 
    //console.log(arr[i]); // this is cool 
    var obj1 = arr[i]; 
    client.get(obj1.title, function(err, response){ 
     if(err){ 
      console.log(err); 
     } 
     if(response){ 
      if(i%3==0){ 
      // mistake 1: 
      // due to async op,loop will already be over and i will be 3 here 
      // mistake 2: 
      // obj1 will be arr[3] here, not what you were expecting :D 
       client.del(obj1.title); 
      }else{ 
       client.incr(obj1.title); 
      }`enter code here` 
     }else{ 
      // so only the last obj gets stored. 
      client.set(obj1.title, 1); 
     } 
}); 
} 
+0

您想到的任何解決方案:P –