0

我有一个非常简单的代码,第一个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 的调用。但事实并非如此。怎么了 ?

4

1 回答 1

1

我在 node_klout github 页面上得到了 Cojohn 的答案。将其粘贴在这里作为答案。


您的代码没有检索 Klout 用户分数,因为您依赖于 for 循环内的 I/O 绑定函数。基本上,您正在启动对 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);
于 2013-07-25T14:53:25.600 回答