【问题标题】:Loop is not working with the Intervals循环不适用于间隔
【发布时间】:2018-05-31 01:40:05
【问题描述】:

我正在使用 Firebase 和 Twitter API 创建一个 Twitter 机器人来取消关注非活动帐户。

这是 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.

在这种情况下我该怎么做才能使循环像以前一样工作?我希望每 20 秒后取消关注少数不活动的 Twitter 帐户,因为我不想陷入速率限制.

提前致谢 :-)

【问题讨论】:

  • 具体的问题是什么? T.post 会抛出任何错误吗?
  • @MarcosCasagrande T.post 不会引发任何错误。但循环不适用于时间间隔..
  • timedLoop 只运行一次,还是从不运行?
  • 按需要连续工作。但不是每 20 秒后。它只是一直不关注人们。
  • 我不明白你的意思:它只是不断地取消关注这些人。你不希望它取消关注人,它会尝试取消关注同一个人两次,或者实际问题是什么?

标签: javascript node.js loops firebase twitter


【解决方案1】:

问题是 firebase 的 .on 侦听器,每次 T.post 结束时都会被调用,因为您要从 to_unfollow/ 中删除。

因此,每次T.post 结束时,您都会创建一个额外的setTimeout 循环,如果您让该代码运行几分钟,您将向 twitter 执行数千个请求。

改用.once 可以解决您的问题。并且在取消关注快照中的所有用户之后,您应该请求另一个设置为 firebase。

【讨论】:

  • 一定是这样,尽管我从未使用过 firebase :)
  • 我不明白你对And after all users from the snapshot are unfollowed, you should call request another set to firebase.的意思
  • 该快照处理完毕后,您可能有更多用户需要取消关注,您应该再次致电:firebase.database().ref("to_unfollow/" + settings.PERSON_TWITTER_HANDLE).once 以查看是否有更多用户
  • 我打错了,you should request another set to firebase
猜你喜欢
  • 1970-01-01
  • 2020-12-05
  • 2014-01-29
  • 2017-01-26
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多