繁体   English   中英

在解决之前延迟ajax请求

[英]Delay ajax request before their resolution

我有一系列的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请求,然后执行第二个,然后执行第三个。 它们应该以〜250ms开始,彼此之间延迟。

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

有没有一种方法可以设置超时时间,并且不放松对ajax分辨率的等待? 还是应该以不同的方式构造代码?

像Rory一样,我对执行此操作是否有用持怀疑态度,但是如果要执行此操作,可以通过返回自己在ajax回调中解决的承诺来实现:

function myfunc(offset) {
    var d = $.Deferred();                      // Create "Deferred" object
    setTimeout(function(){
        return $.ajax({
            url:"https://www.URL.com",
            crossDomain: true,
            dataType: "jsonp",
            success: function (response) {
                // console.log(response);
                data = data.concat(response);
                d.resolve();                   // Resolve it
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                // handle errors
                d.reject();                    // Reject it
            } 
        });
    },offset/10);
    return d.promise();                        // Return its promise
}

根据上面的代码及其工作方式(以特定顺序加入一堆响应)……您可以尝试以下类似方法:

 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> 

根据您的要求,虽然听起来很奇怪,但看来您可能会做得更好。

罗里·波恩特(Rory point)非常好,但是如果您仍然想这样做,我会做类似的事情。

var arrayFunc = [func1, func2, func3]

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

工作小提琴


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM