【问题标题】:Javascript - Set interval for each array value. setinterval, array, foreachJavascript - 为每个数组值设置间隔。设置间隔,数组,foreach
【发布时间】:2014-10-05 01:32:16
【问题描述】:

我试图在某个时间间隔内获取每个数组链接。 例如:我得到第一个链接,等待 30 秒,下一个链接,等待 30 秒另一个链接等。 这是我的代码:

var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'];

setInterval(function(){
        urls.forEach(function(entry){
            console.log(entry);
            ajaxd(entry);
            console.log("merge pana aici");
        });
    },30000);

function ajaxd(my_url) {
    $.ajax({
        type : "POST",
        url : my_url,
        success : function(msg) {
            console.log(my_url);
        }
    });
}

问题是,30 秒后我得到了所有链接。不是第一个值,等待 30 秒,下一个值等等..

【问题讨论】:

    标签: javascript php jquery arrays


    【解决方案1】:

    EDIT更新代码以导致循环重复。

    (function() {
    
      var urls = ['http://mylink1', 'http://mylink2', 
                  'http://mylink3', 'http://mylink4'];
    
      // Start off at the first element.
      var idx = 0;
      var len = urls.length;
    
      // Do the next link
      function doNext() {
        var entry = urls[idx];
    
        console.log(idx + ":" + entry);
        //ajaxd(entry);
    
        idx++;
        console.log([idx, len]);
        if (idx < len) {
          // Don't do anything special
        }  else {
          // Reset the counter
          idx = 0;
        }
        setTimeout(doNext, 300);      }
    
      // And the code needs kicked off somewhere
      doNext();
    
    }());//end of function 
    

    【讨论】:

    • 谢谢@Jeremy J Starcher。这是一个很好的答案,但我需要一个循环,在 link4 重复数组之后。 :)
    • @Andrei 进行了最小的更改以使其重复...我更新了代码来处理它。
    • @JeremyJStarcher 如果我想在 link4 之后暂停一下,你能帮我吗?例如:link4 -- 等待 60 秒 --(重复数组?:))
    • 您拥有添加该功能所需的所有工具。试一试,如果您无法弄清楚,那么应该将其作为一个新问题提出。如果你不能自己解决,stackoverflow.com/questions/16873889/…
    • 我在控制台中使用此代码邀请我的朋友在 90 年代间隔为我在 Facebook 上的页面点赞,以避开他们的视线。击败手点击 500 个按钮;)谢谢 Jeremy。
    【解决方案2】:

    创建一个 foreach 将在间隔后立即遍历数组中的所有值。

    更好的解决方案是不迭代...

    例如

    var counter = 0;
    
    setInterval(function(){
      if(counter < url.length){
        ajaxd(url[counter]);
        counter++;
      }else
        return;
    }, 30000);
    

    【讨论】:

    • 目前为止最好的答案是让它成为一个无限循环,只需在其他条件下将计数器设置为 0,它就会重新启动,这正是我所需要的谢谢队友
    【解决方案3】:

    如果您仍想使用forEach 循环数组,您可以将它与 setTimeout 一起使用,而不是与setInterval 一起使用。

    var urls = ['http://mylink1', 'http://mylink2', 'http://mylink3', 'http://mylink4'],
        interval = 2000, //  = 2s
        increment = 1;
    
    urls.forEach(function(url) {
      var runner = setTimeout(function() {
        // Do your stuff.
        console.log(url);
    
        clearTimeout(runner);
      }, interval * increment);
    
      increment = increment + 1;
    });
    

    【讨论】:

      【解决方案4】:

      在您的闭包中,您使用 for 循环一次请求所有项目。

      【讨论】:

        【解决方案5】:
        var urls = ['http://mylink1','http://mylink2','http://mylink3','http://mylink4'],
        
        var request = function(index) {
            $.ajax({
                type : "POST",
                url : urls[index],
                success : function(content) {
                    console.log(content);
                    if (index + 1 < urls.length) {
                        setTimeout(function () {
                            request(index + 1);
                        }, 30 * 1000); // 30s
                    }
                }
            });
        }
        
        request(0);
        

        【讨论】:

          【解决方案6】:

          你做错了尝试每 30 秒创建一个计数器。 检查此代码:

          $(document).ready(function(){
          
              var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'],
                  counter = 0;
          
                  obj = {}
          
              obj.ajaxd = function(my_url) {
                  $.ajax({
                      type : "POST",
                      url : my_url,
                      success : function(msg) {
                          console.log(my_url);
                      }
                  });
              }
          
              obj.leftInterval = setInterval(function(){
                  if(urls[counter] != undefined){
                      obj.ajaxd(urls[counter]);   
                      counter++;
                  }else{
                      counter = 0;
                   }
          
               },30000);
          
           });
          

          【讨论】:

          • 谢谢@NEWBIE。你忘了if(urls[counter] != undefined) { 和`...},30000); });.如果您想编辑您的代码,再次感谢
          【解决方案7】:

          使用这个:

          var urls = [ 'http://mylink1','http://mylink2','http://mylink3','http://mylink4'];
          urls.reverse();
          var interval = setInterval(function(){ 
              if(urls.length == 0){
                  clearInterval(interval);
                  return;
              }
              var entry = urls.pop();
              console.log(entry);
              ajaxd(entry);
              console.log("merge pana aici");
          }, 30000);
          

          请注意,这将更改您的数组。它将从中删除元素,直到它为空。

          编辑:根据 Andrei 的评论,在 clearInterval 之后添加了一个 return 语句 :) 谢谢。

          【讨论】:

          • 很好的答案,但是在link4之后,你得到了未定义并且循环结束了。 :) [Salutari din romania :)) ]
          猜你喜欢
          • 1970-01-01
          • 2016-08-21
          • 2023-03-05
          • 2018-06-26
          • 1970-01-01
          • 2013-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多