V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
isbase
V2EX  ›  问与答

如何设置 Ajax 同步发送请求的间隔时间?

  •  
  •   isbase · 2016-07-04 19:31:43 +08:00 · 3233 次点击
    这是一个创建于 3056 天前的主题,其中的信息可能已经有所发展或是发生改变。
      var xhr = new XMLHttpRequest();
      for (var i = 0; i < 10; i++) {
          (function(x) {
              setInterval(function() {
                  var newCode = code.replace(/replace/, newArr[x]);
                  xhr.open('post', '/register.php?', false)
                  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                  xhr.send('reginvcode=' + newCode + '&action=reginvcodeck');
              }, 3000)
          }(i))
      }
      
    

    想把一个数组的全部数据通过ajax发送出去

    设置 setInterval 的本意是每隔 3 秒发送一次请求,实际上是完全没有间隔时间,一个请求执行完毕另一个请求马上又开始了。

    正确的方法应该怎么做呢?

    15 条回复    2016-07-04 23:37:44 +08:00
    binux
        1
    binux  
       2016-07-04 20:05:29 +08:00
    「每隔 3 秒发送一次请求」是什么意思?
    你这么写不就是毎 3 秒发送 10 个请求吗?
    那就是每个 i 间隔 30 秒?
    FrankFang128
        2
    FrankFang128  
       2016-07-04 20:22:53 +08:00
    不要发送同步请求
    不要发送同步请求
    不要发送同步请求
    FrankFang128
        3
    FrankFang128  
       2016-07-04 20:24:12 +08:00
    而且代码明显有问题,用了循环就不应该用 Interval 吧,用 timeout
    FrankFang128
        4
    FrankFang128  
       2016-07-04 20:24:41 +08:00
    无力吐槽,楼主在用同步的思想写 JS ,当然写不好。
    isbase
        5
    isbase  
    OP
       2016-07-04 20:42:21 +08:00 via Android
    @binux 就是目标网站只要三秒之内发送两个请求就会出错,所以想间隔 3 秒发送一个请求
    isbase
        6
    isbase  
    OP
       2016-07-04 20:49:17 +08:00 via Android
    @FrankFang128 这方面确实没什么经验😥😥
    hcwhan
        7
    hcwhan  
       2016-07-04 20:49:28 +08:00 via Android   ❤️ 1
    你的 for 没有被阻塞 一下都执行了
    ck65
        8
    ck65  
       2016-07-04 20:57:07 +08:00 via iPhone   ❤️ 1
    你的 for 在一瞬间开了十个几乎同时开始的 setTimeout 。
    hcwhan
        9
    hcwhan  
       2016-07-04 21:03:06 +08:00 via Android   ❤️ 1
    简单点这样写
    var i=0;
    function ajaxPost() {
    // post 操作
    ...
    i++;
    if (i<10){
    setTimeout(ajaPost, 3000)
    }
    }
    ajaxPost():
    hcwhan
        10
    hcwhan  
       2016-07-04 21:05:07 +08:00 via Android   ❤️ 1
    写 js 要注意没有阻塞 用回调
    hcwhan
        11
    hcwhan  
       2016-07-04 21:08:28 +08:00 via Android
    如果是依据上一个 Post 结果处理 可以看下 promise
    isbase
        12
    isbase  
    OP
       2016-07-04 21:47:35 +08:00
    @hcwhan Thanks
    isbase
        13
    isbase  
    OP
       2016-07-04 21:48:38 +08:00
    @ck65 瞬间点醒 😓
    isbase
        14
    isbase  
    OP
       2016-07-04 21:49:41 +08:00
    @hcwhan 这个写法完美解决问题
    shiye515
        15
    shiye515  
       2016-07-04 23:37:44 +08:00   ❤️ 1
    把代码中的 3000 替换成 3000*(x+1)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.