2012-04-29 3 views
1

내 client.multi 사용하여 나는 장치 목록을 가져 오지하고 각각에 대한 상태 및 라벨을 받아야 다음과 같은 코드가 있습니다node_redis : 대해 forEach

app.get('/test', function(req, res){ 
    db.smembers("devices", function(err1, devices){ 
    var jsonObj = {}; 
    if(!err1) { 
     var i = 0; 
     devices.forEach(function(id){ 
      db.multi([ 
      ["get", id + ":label"], 
      ["get", id + ":status"], 
      ]).exec(function (err, replies) { 
      jsonObj[id] = {"label":replies[0], "status":replies[1]}; 
      console.log(jsonObj);  // stuff is added on each loop 
      }); 

      i = i + 1; 
      if(i == devices.length){ 
      console.log(jsonObj);  // jsonObj is {}  
      h.respond(res, jsonObj); 
      } 
     }); 
    } else { 
     h.respond(res, { "error" : err1 }); 
    } 
    }); 
}); 

장치 ID의 목록입니다. 각각의 id에는 "ID : status", "ID : label"키가 있습니다.

h.respon은 http 응답을 보내는 도우미 메서드입니다.

각 루프에서 jsonObj에 추가되는 새 데이터를 볼 수 있지만 모든 루프가 완료되면 비어 있습니다.

+0

비슷한 문제가있었습니다. 좋은 quesion – Federico

답변

2

코드는 비동기 적으로 실행되며 Redis 호출이 실제로 완료되기 전에 devices.length까지 계산됩니다 (계속하기 전에 복귀하기 위해 multi에서 콜백을 기다리지 않습니다). 수표를 콜백으로 이동하면이 문제를 방지 할 수 있습니다.

app.get('/test', function(req, res){ 
    db.smembers("devices", function(err1, devices){ 
    var jsonObj = {}; 
    if(!err1) { 
     var i = 0; 
     devices.forEach(function(id){ 
      db.multi([ 
      ["get", id + ":label"], 
      ["get", id + ":status"], 
      ]).exec(function (err, replies) { 
      jsonObj[id] = {"label":replies[0], "status":replies[1]}; 
      console.log(jsonObj);  // stuff is added on each loop 
      i = i + 1; 
      if(i == devices.length){ 
       console.log(jsonObj);  // jsonObj is {}  
       h.respond(res, jsonObj); 
      } 
      }); 


     }); 
    } else { 
     h.respond(res, { "error" : err1 }); 
    } 
    }); 
}); 

은 아마 별도의 함수로이 코드를 이동하는 더 이해하지만 잘하면 당신은 아이디어를 얻을. async과 같은 비동기 라이브러리는 이와 같은 병렬 비동기 루프를 훨씬 쉽게 수행 할 수있는 도우미 메서드를 제공합니다.

+0

난 rigth 콜백 수준에 없었어요, 덕분에 지금은 잘하고있어! – Luc

+0

멋지게 목격되었습니다! 나는 [async] (https://github.com/caolan/async)에 대한 권고를 2 번째로 추천한다. 이 라이브러리를 충분히 추천 할 수는 없지만 최소한의 복잡성으로 이러한 종류의 흐름 제어를 정리하는 것이 좋습니다. –