2016-09-07 7 views
0

다음과 같은 for 루프가 예상대로 실행되지 않습니다.Nodejs 루프가 제대로 작동하지 않습니다.

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); 

} 

참고 : -

위의 프로그램의 결과를 확인하기 위해 별도의 프로그램으로 가져 오기를 실행하십시오.

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 –

관련 문제