2013-07-22 1 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. вставляя его здесь в качестве ответа.


Ваш код не запрашивает оценку пользователя Klout, потому что вы полагаетесь на I O связанные функции/внутри для цикла. В принципе, вы увольняете первоначальные вызовы API Klout, которые обычно возвращаются и печатаются на консоль, и ваш процесс либо заканчивается, либо функция возвращается, прежде чем у нее будет возможность выполнить klout.getUserScore(). Ниже приведен пример кода, который всегда будет ждать ответа до выхода; обратите внимание, что мой тестовый взлом не особенно быстрый или «асинхронный», он обрабатывает только одного пользователя за раз и не подходит для больших списков пользователей. Мои имена и api_key vars были опущены, вам нужно будет предоставить свои собственные.

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);