3

私は javascript と node.js に不慣れで、これが私の最初の投稿です。ご容赦ください。

ntwitter を使用して、特定のユーザーの以前のツイートをすべて取得しています。

私の問題は、ユーザーが 200 を超えるツイートを持っている場合、ループを作成する必要があり、それが正しいかどうかわからないことです。

これは、最新の 200 件のツイートを取得する非同期関数です。

exports.getUserTimeline = function(user, callback) {

  twit.getUserTimeline({ screen_name: user, count: 200 }, function(err, data) {
    if (err) { 
      return callback(err);
    }
    callback(err, data);  
  });
}

再帰関数を使用してこれを行う解決策を見つけましたが、かなり醜い..どうすれば改善できますか?

exports.getUserHistory = function(user, callback) {
  recursiveSearch(user, callback);
  function recursiveSearch(user, callback, lastId, data) {
    var data = data || []
      , args = {screen_name: user, count: 200};

    if(typeof lastId != "undefined") args.max_id = lastId;

    twit.getUserTimeline(args, function(err, subdata) {
      if (err) { 
        console.log('Twitter search failed!');
        return callback(err);
      }
      if (data.length !== 0) subdata.shift();
      data = data.concat(subdata);
      var lastId = parseInt(data[data.length-1].id_str);
      if (subdata.length !== 0) {
        recursiveSearch(user, callback, lastId, data);
      } else {
        callback(err, data);
      }
    });
  }
}

どうもありがとう!


更新:これは、hunterloftis によって提案された、2 つの変更を加えた改良 (リファクタリング) 関数です。

  1. プロパティ max_id は最初の反復で指定しないでください
  2. ユーザーは存在するが、ツイートが投稿されていない場合を処理する必要があります

コード:

function getUserHistory(user, done) {
  var data = [];
  search();

  function search(lastId) {
    var args = {
      screen_name: user,
      count: 200,
      include_rts: 1
    };
    if(lastId) args.max_id = lastId;

    twit.getUserTimeline(args, onTimeline);

    function onTimeline(err, chunk) {
      if (err) {
        console.log('Twitter search failed!');
        return done(err);
      }

      if (!chunk.length) {
        console.log('User has not tweeted yet');
        return done(err);
      }

      //Get rid of the first element of each iteration (not the first time)
      if (data.length) chunk.shift();

      data = data.concat(chunk);
      var thisId = parseInt(data[data.length - 1].id_str);

      if (chunk.length) return search(thisId);
      console.log(data.length + ' tweets imported');
      return done(undefined, data);
    }
  }
}

ツイートを取得すると、ツイート数がユーザーの「statuses_count」プロパティと常に同じではないことに気付きました。この差が削除されたツイートの数に対応することを理解するのに少し時間がかかりました:)

4

1 に答える 1

1

再帰関数は機能しますか? 私にはあまり悪く見えません。私はそれを次のようなものに少しだけリファクタリングするかもしれません:

function getUserHistory(user, done) {
  var data = [];
  search();

  function search(lastId) {
    var args = {
      screen_name: user,
      count: 200,
      max_id: lastId
    };

    twit.getUserTimeline(args, onTimeline);

    function onTimeline(err, chunk) {
      if (err) {
        console.log('Twitter search failed!');
        return done(err);
      }

      if (data.length) chunk.shift(); // What is this for?
      data = data.concat(chunk);
      var thisId = parseInt(data[data.length - 1].id_str);

      if (chunk.length) return search(thisId);
      return done(undefined, data);
    }
  }
}
于 2013-01-10T17:18:48.293 に答える