isbase
V2EX  ›  问与答

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

  •  
  •   isbase ·
    PRO
    · Jul 4, 2016 · 3658 views
    This topic created in 3626 days ago, the information mentioned may be changed or developed.
      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 replies    2016-07-04 23:37:44 +08:00
    binux
        1
    binux  
       Jul 4, 2016
    「每隔 3 秒发送一次请求」是什么意思?
    你这么写不就是毎 3 秒发送 10 个请求吗?
    那就是每个 i 间隔 30 秒?
    FrankFang128
        2
    FrankFang128  
       Jul 4, 2016
    不要发送同步请求
    不要发送同步请求
    不要发送同步请求
    FrankFang128
        3
    FrankFang128  
       Jul 4, 2016
    而且代码明显有问题,用了循环就不应该用 Interval 吧,用 timeout
    FrankFang128
        4
    FrankFang128  
       Jul 4, 2016
    无力吐槽,楼主在用同步的思想写 JS ,当然写不好。
    isbase
        5
    isbase  
    OP
    PRO
       Jul 4, 2016 via Android
    @binux 就是目标网站只要三秒之内发送两个请求就会出错,所以想间隔 3 秒发送一个请求
    isbase
        6
    isbase  
    OP
    PRO
       Jul 4, 2016 via Android
    @FrankFang128 这方面确实没什么经验😥😥
    hcwhan
        7
    hcwhan  
       Jul 4, 2016 via Android   ❤️ 1
    你的 for 没有被阻塞 一下都执行了
    mogita
        8
    mogita  
       Jul 4, 2016 via iPhone   ❤️ 1
    你的 for 在一瞬间开了十个几乎同时开始的 setTimeout 。
    hcwhan
        9
    hcwhan  
       Jul 4, 2016 via Android   ❤️ 1
    简单点这样写
    var i=0;
    function ajaxPost() {
    // post 操作
    ...
    i++;
    if (i<10){
    setTimeout(ajaPost, 3000)
    }
    }
    ajaxPost():
    hcwhan
        10
    hcwhan  
       Jul 4, 2016 via Android   ❤️ 1
    写 js 要注意没有阻塞 用回调
    hcwhan
        11
    hcwhan  
       Jul 4, 2016 via Android
    如果是依据上一个 Post 结果处理 可以看下 promise
    isbase
        12
    isbase  
    OP
    PRO
       Jul 4, 2016
    @hcwhan Thanks
    isbase
        13
    isbase  
    OP
    PRO
       Jul 4, 2016
    @ck65 瞬间点醒 😓
    isbase
        14
    isbase  
    OP
    PRO
       Jul 4, 2016
    @hcwhan 这个写法完美解决问题
    shiye515
        15
    shiye515  
       Jul 4, 2016   ❤️ 1
    把代码中的 3000 替换成 3000*(x+1)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3153 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 13:53 · PVG 21:53 · LAX 06:53 · JFK 09:53
    ♥ Do have faith in what you're doing.