2013-07-22 41 views
0

我有一個非常簡單的代碼,第一個console.log打印klout_user.id,但它從不打印第二個,即klout_response.score。 名稱是一組Twitter名稱。 由於控制流程,問題可能會發生。我試着獨立運行兩個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

我收到了Cojohn在node_klout github頁面的答案。粘貼在這裏作爲答案。因爲你依賴於I/O密集型功能的內部for循環


代碼未檢索的Klout得分用戶。基本上,您正在觸發對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);