2013-01-10 48 views
3

我是JavaScript和node.js的新手,這是我的第一篇文章,所以請耐心等待。檢索node.js中特定用戶的最後3200條推文

我正在使用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與兩個修飾建議的改善(重構)函數:

  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」屬性。我花了一些時間才發現,這種差異對應於刪除的推文數量:)

回答

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); 
    } 
    } 
} 
+0

非常感謝您的回答。是的,它很好,看到我更新的問題 – xa4

相關問題