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);
Другие вопросы по тегам