node_klout node.js: getKloutIdentity, за которым следует getUserScore, не работает
У меня очень простой код, и первый console.log печатает klout_user.id, но он никогда не печатает второй, то есть klout_response.score. names - это массив имен твиттеров. Проблема может быть также из-за потока управления. Я попытался выполнить оба вызова 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 также должен быть выполнен. Но это не так. в чем дело?
1 ответ
Я получил ответ от Cojohn на странице github node_klout. вставить его здесь в качестве ответа.
Ваш код не получает оценку пользователя Klout, потому что вы полагаетесь на функции, связанные с вводом / выводом внутри цикла for. По сути, вы запускаете начальные вызовы API Klout, которые обычно возвращаются и выводятся на консоль, и ваш процесс либо завершается, либо функция возвращается до того, как она сможет выполнить 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);