我有一个非常简单的代码,第一个console.log打印klout_user.id,但它从来没有打印第二个,也就是klout_response.score。names是twitter屏幕名称的数组。问题也可能是由于控制流造成的。我尝试单独运行这两个klout调用,并且它工作正常。但它在以下代码中不起作用。有什么线索吗?
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的调用。但事实并非如此。出什么事了?
发布于 2013-07-25 22:53:26
我在node_klout github页面上得到了Cojohn的答案。将它粘贴到这里作为答案。
您的代码不会检索Klout用户分数,因为您依赖于for循环中的I/O绑定函数。基本上,您触发了对Klout API的初始调用,这些调用正常返回并打印到控制台,而您的进程要么正在完成,要么函数在它有机会执行klout.getUserScore()之前就返回了。下面是一个在退出之前总是等待响应的代码示例;请注意,我的测试hack并不是特别快或“异步”的,它一次只处理一个用户,并且不适合大的用户列表。我的名字和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);https://stackoverflow.com/questions/17788753
复制相似问题