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與兩個修飾建議的改善(重構)函數:
- 屬性max_id不應在第一次迭代
- 的情況下指定用戶存在但未發佈任何推文必須處理
代碼:
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」屬性。我花了一些時間才發現,這種差異對應於刪除的推文數量:)
非常感謝您的回答。是的,它很好,看到我更新的問題 – xa4