2017-09-07 13 views
0

私は、2つの日付の間にTwitterユーザーのつぶやきをカウントするNodeJSアプリケーションに取り組んでいます。私はTwitter APIで指定された最大200カウント未満の日付を扱っています。しかし、私はAPI再帰呼び出しを2回実行することに問題があります。複数の呼び出しを行うことで200を超えることができます。Twitter APIを使用したノード関数の再帰

module.exports = function (user, start, end, callback) { 
    var Twitter = require('twitter'); 
    var client = new Twitter({ 
    // keys 
    }); 

    var max_id = null; 
    getTweets(start, user, max_id, t => { 

    /* 
    * DO STUFF (set up dates, calculate, and filter t to dates between start and end 
    */ 

    callback({ 
     user: user, 
     tweets: t.length, 
     startdate: start.toLocaleDateString(), 
     enddate: end.toLocaleDateString(), 
     totaldays: totaldays, 
     average: average 
    }); 
    }); // End getTweets call 

    function getTweets(s, u, m, cb) { 
    var options = { 
     screen_name: u, 
     count: 200, 
     result_type: "recent", 
     trim_user: 1, 
     include_rts: 1 
    }; 
    if (m != null) options.max_id = m; 

    client.get('statuses/user_timeline', options, (e,t,r) => { 
     if (e) console.error(e); 
     var oldest = t[t.length - 1]; 
     console.log(oldest.created_at + " | " + s); 

     if (new Date(oldest.created_at) > new Date(s)) { 
     console.log("recursing..."); 
     getTweets(s, u, oldest.id, x => t = t.concat(x)); 
     } else { 
     console.log("Got tweets, executing callback"); 
     cb(t); 
     } 
    }); 
    } // End getTweets function 
} // End module.exports function 

<のつぶやきで日付を入力すると、正常に動作します。私はしかし、再帰条件にヒットすると、それがハングし、コンソールが表示さ:

Tue Aug 15 19:14:31 +0000 2017 | 2017-08-08 
recursing... 
Thu Jul 27 20:44:54 +0000 2017 | 2017-08-08 
Got tweets, executing callback 

しかし何もありません、それだけでハングします。何が起きてる?

答えて

0

よくあることですが、良い夜の休息と新鮮な外観は私に答えを示しました。コールバックを実行してスタックを戻そうとするのではなく、スタックの一番上にデータを渡し、そこで元のコールバックを実行します。 Thusly:

getTweets([], start, user, max_id, t => { 

...

function getTweets(t, s, u, m, cb) { 

...

client.get('statuses/user_timeline', options, (err,twt,res) => { 
    if (err) console.error(err); 
    t = t.concat(twt); 

    if (new Date(oldest.created_at) > new Date(s)) { 
    console.log("getting more..."); 
    getTweets(t, s, u, oldest.id, cb) ; 

    } else { 
    console.log("Got tweets, executing callback"); 
    cb(t); 
    } 

...

は完璧に動作します!これが誰かを助けることを望みます。