[英]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.