Цикл не работает с интервалами - PullRequest
0 голосов
/ 31 мая 2018

Я создаю бота Twitter, используя Firebase и Twitter API, чтобы отписаться от неактивных учетных записей.

Это был код Nodejs:

// Get the screen_names in `to_unfollow` table
firebase.database().ref("to_unfollow/" + settings.PERSON_TWITTER_HANDLE).on("value", function(snapshot) {

// Functional Loop
var i = 0;
function timedLoop() { // unFollows the user after every `x` seconds

      /*=============================================>>>>>
      = Thing to be done =
      ===============================================>>>>>*/

        function snapshotToArray(snapshot) { // This function converts the Snapshot data into an array
            var returnArr = [];

            snapshot.forEach(function(childSnapshot) {
                var item = childSnapshot.val();
                item.key = childSnapshot.key;

                returnArr.push(item);
            });

            return returnArr;
        };

        var screen_name_to_unfollow = snapshotToArray(snapshot)[i].key;

        console.log(screen_name_to_unfollow);

      /*= End of Thing to be done =*/
      /*=============================================<<<<<*/

      // Increase value of variable `i` by 1. (Increment)
      i++;

      // How many times to loop
      if(i < 5000) {
          setTimeout( timedLoop, 1000*20 ); // timedLoop();
      }

  }

  timedLoop(); // Run the loop

});

Здесь мой цикл работал очень хорошо.Переменная screen_name_to_unfollow регистрировалась в консоли через каждые 20 секунд.


Но когда я добавляю исполнительный код, чтобы отписаться от людей, цикл работает ... но не с интервалом времени.Это просто продолжает отписываться от людей.

Вот как выглядит мой код после:

// Get the screen_names in `to_unfollow` table
firebase.database().ref("to_unfollow/" + settings.PERSON_TWITTER_HANDLE).on("value", function(snapshot) {

// Functional Loop
var i = 0;
function timedLoop() { // unFollows the user after every `x` seconds

      /*=============================================>>>>>
      = Thing to be done =
      ===============================================>>>>>*/

        function snapshotToArray(snapshot) { // This function converts the Snapshot data into an array
            var returnArr = [];

            snapshot.forEach(function(childSnapshot) {
                var item = childSnapshot.val();
                item.key = childSnapshot.key;

                returnArr.push(item);
            });

            return returnArr;
        };

        var screen_name_to_unfollow = snapshotToArray(snapshot)[i].key;

        console.log(screen_name_to_unfollow);

        // UnFollow
        T.post('friendships/destroy', { screen_name: screen_name_to_unfollow },  function (err, data, response) {
          console.log('T.Post', new Date());
          if(!err){
            console.log(settings.PERSON_NICKNAME + " follower " + screen_name_to_unfollow + " unfollowed.");

            // Create an `unfollowed` table and insert the screen_name there
            firebase.database().ref("unfollowed").child(settings.PERSON_TWITTER_HANDLE).update({
              [screen_name_to_unfollow]: {
                connection: "unfollowed"
              }
            });

            // Delete the screen_name from `to_unfollow` table
            firebase.database().ref("to_unfollow/" + settings.PERSON_TWITTER_HANDLE).child(screen_name_to_unfollow).remove();

          } else{
            console.log(err);
          }
        });

      /*= End of Thing to be done =*/
      /*=============================================<<<<<*/

      // Increase value of variable `i` by 1. (Increment)
      i++;

      // How many times to loop
      if(i < 5000) {
          setTimeout( timedLoop, 1000*20 ); // timedLoop();
      }

  }

  timedLoop(); // Run the loop

});

В терминале видно, что интервалы не сработали.

T.Post 2018-05-31T02:11:27.234Z
Wesbos follower AnnSaid unfollowed.
T.Post 2018-05-31T02:11:27.914Z
Wesbos follower AnnyShivang unfollowed.
T.Post 2018-05-31T02:11:28.865Z
Wesbos follower AntJanus unfollowed.
T.Post 2018-05-31T02:11:29.888Z
Wesbos follower AnthonyCatonPR unfollowed.
T.Post 2018-05-31T02:11:30.975Z
Wesbos follower AppleLaa unfollowed.
T.Post 2018-05-31T02:11:31.733Z
Wesbos follower AsyrafDuyshart unfollowed.

Что я могу сделать в этой ситуации, чтобы цикл работал так, как он работал раньше? Я хочу отписываться от нескольких неактивных учетных записей Twitter через каждые 20 секунд, потому что я не хочу падать в предельном размере.

Заранее спасибо: -)

1 Ответ

0 голосов
/ 31 мая 2018

Проблема в том, что .on слушатель firebase вызывается каждый раз, когда T.post заканчивается, так как вы удаляете из to_unfollow/.

Так что каждый раз, когда T.post заканчивается, вы 'Создайте дополнительный цикл setTimeout, и если вы позволите этому коду работать несколько минут, вы будете выполнять тысячи запросов в твиттер.

Использование .once вместо этого решит вашу проблему.И после того, как все пользователи из снимка отписались, вам следует запросить другой набор для firebase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...