在解决之前延迟ajax请求

时间:2016-02-15 14:06:04

标签: javascript jquery ajax

我有一系列ajax请求,在继续执行之前都等待解决 (通过$.when().then()实现):

function myfunc(offset) {
    // setTimeout(function(){
        return $.ajax({
            url:"https://www.URL.com",
            crossDomain: true,
            dataType: "jsonp",
            success: function (response) {
                // console.log(response);
                data = data.concat(response);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                // handle errors
            } 
        });
    // },offset/10);-
}

$.when( // call all ajax requests
    myfunc(0)
    ,myfunc(2500)
    ,myfunc(5000)
    ,myfunc(7500)
    ,myfunc(10000)
    ,myfunc(12500)
    ,myfunc(15000)
    ,myfunc(17500)
    )
.then(function() { // when all the ajax requests are terminated
    console.log(data);
});

我想稍微延迟一下,让它“更有可能”以某种顺序结束 (参见上面代码中的setTimeout)。

  

我不想执行第一个ajax请求,然后是第二个,然后是第三个。他们应该从约250毫秒的延迟开始。

但我的尝试只会导致承诺立即得到解决,而不会完成ajax请求,因而是空数据。

有没有办法设置超时并且没有放弃等待ajax解析?或者我应该以不同的方式构建我的代码?

3 个答案:

答案 0 :(得分:2)

Like Rory我对这样做的用处持怀疑态度,但如果你想这样做,你就可以通过回复你在{{1回调:

ajax

答案 1 :(得分:0)

基于上面的代码以及你正在做的事情(按特定顺序加入一堆响应)......你可以尝试下面的代码:

urlArr = [
  "http://jsonplaceholder.typicode.com/posts",
  "http://jsonplaceholder.typicode.com/comments"
];

function joinResponses(arr) {
  var promises = arr.map(function(url) {
    return $.ajax(url).then(function(res) {
      return JSON.stringify(res);
    });
  })
  return $.when.apply($,promises).then(function() {
    var joined = "";
    for(var i = 0; i<arguments.length;i++) {
      joined += arguments[i];
    }
    return joined;
  });
}

joinResponses(urlArr).then(function(myJoinedResponses) {
  document.write(myJoinedResponses);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

根据你所要求的内容虽然听起来很奇怪,但你似乎可以做得更好。

答案 2 :(得分:-1)

Rory点非常好,但是如果你想要这样做的话......我会做那样的事情。

var arrayFunc = [func1, func2, func3]

for (var i = 0; i < arrayFunc.length; i++) {
  (function() {
    var j = i;
    setTimeout(() => {
      arrayFunc[j]();
    }, i * 2500);
  })();
}

Working Fiddle

编辑:setTimeout函数
edit2:修正了关闭错误