2013-07-22 2 views
0

나는 매우 간단한 코드를 가지고 있으며 첫 번째 console.log는 klout_user.id를 인쇄하지만 두 번째는 결코 klout_response.score를 인쇄하지 않습니다. names는 트위터 화면 이름의 배열입니다. 제어 흐름 때문에 문제가 발생할 수도 있습니다. klout 호출을 독립적으로 실행하려고 시도했지만 작동합니다. 그러나 다음 코드에서는 작동하지 않습니다. 어떤 단서?node_klout node.js : getKloutIdentity 다음에 getUserScore가 작동하지 않음

names.forEach(function (name, i) { 
    klout.getKloutIdentity(name, function(error, klout_user) { 
     if (klout_user.hasOwnProperty("id") && klout_user.id > 0) { 
      console.log("klout user", name, "has id : ", klout_user.id); 
      klout.getUserScore(klout_user.id, function(error, klout_response) { 
      console.log("klout_user score : ", klout_response.score); 
     }); 
     } 
    }); 
}); 

첫 번째 console.log를 인쇄하므로 getUserScore에 대한 호출도 실행되어야한다는 인상을 받고 있습니다. 그러나 그렇지 않습니다. 뭐가 문제 야 ?

+0

'kid' 변수의 범위는 무엇입니까? – f0x

+0

죄송합니다. klout_user.id입니다. 질문을 업데이트했습니다 ... 이것은 의사 코드입니다 .. – user644745

답변

1

나는 node_klout github 페이지에서 Cojohn의 답을 얻었다. 답변으로 여기에 붙여 넣습니다.


for 루프 내에서 I/O 바운드 기능을 사용하기 때문에 코드에서 Klout 사용자 점수를 검색하지 않습니다. 기본적으로, 당신은 Klout API에 대한 초기 호출을 해고하고 있습니다. Klout API는 정상적으로 돌아가서 콘솔로 출력되며, 프로세스는 완료 중이거나 klout.getUserScore()를 실행할 기회가 오기 전에 함수가 반환 중입니다. 아래는 종료 전에 항상 응답을 기다리는 코드의 예입니다. 내 테스트 해킹이 특히 빠르지 않거나 "비동기 적"이 아니라 한 번에 한 명의 사용자 만 처리하므로 큰 사용자 목록에는 적합하지 않습니다. 내 이름과 api_key 변수는 생략되었으므로 직접 제공해야합니다.

var klout = new Klout(api_key, "json", "v2"); 
var events = require("events"); 

var e = new events.EventEmitter(); 

e.on("done", function() { 
    process.exit(); 
}); 

e.on("next", function(i) { 
    if (i >= names.length) { 
     e.emit("done"); 
     return; 
    } 

    console.log("retrieving kloutid for user %s", names[i]); 
    klout.getKloutIdentity(names[i], function(error, klout_user) { 
     if (error) { 
      console.log(error); 
      e.emit("next", i+1); 
      return; 
     } 

     if (!klout_user.hasOwnProperty("id") || klout_user.id <= 0) { 
      e.emit("next", i+1); 
      return; 
     } 

     console.log("klout user %s has id : %s", names[i], klout_user.id); 

     klout.getUserScore(klout_user.id, function(error, klout_response) { 
      if (error) { 
       console.log(error); 
       e.emit("next", i+1); 
       return; 
      } 

      console.log("klout_user score : %s", klout_response.score); 
      e.emit("next", i+1); 
     });   
    }); 
}); 

e.emit("next", 0); 
관련 문제