你好,
我想问是否有可能继续流产Ajax。我在这样的defferreds中接到了ajax的Arraz:
var defferreds = [];
defferreds.push(
$soap.ajax({
type: "POST",
dataType: "json",
url: "some_url.php",
cache: false,
}).done(function(data) {
/* do something */
}).fail(function(jqXHR,status, errorThrown) {
console.log(jqXHR.responseText);
})
);
defferds阵列中的又有20个Ajax(ES)。当用户单击ABORT_AJAX按钮时,它应该中止所有尚未完成的AJAX。我使用此功能这样做:
function abort_ajaxes(){
for(var i = 0; i < defferreds.length; i++){
if(defferreds[i] && defferreds[i].readyState != 4){
defferreds[i].abort();
} else {
delete defferreds[i];
}
}
}
这里是我需要您帮助的部分。用户点击简历_ajax按钮,它应该从defferreds数组中调用其余的ajaxes并完成它们。问题是,即使我将其存储在我的defferreds中,我也不知道如何开始中止Ajax。是否可以恢复流产的Ajaxes?只有那些流产的,而不是成功结束的人?
编辑:我问是否有可能仅重新完成Ajaxes。我尝试了这里使用的解决方案,但它不能解决我的具体问题。一旦我单击简历_ajax按钮,即使我使用了此代码,也不会发生:
$('.resume_ajax').click(function(){
for (var key in defferreds){
$soap.ajax(defferreds[key]);
}
});
再次流产的Ajaxes的代码的确切行是什么?Ajax呼叫看起来像我的defferreds数组中的一个人甚至可以实现吗?因为正如我所说,什么都没发生。
edit2:
我运行这样的ajaxes:
function run_ajaxes(){
var defferreds = [];
/* there are around 20 same ajax calls just with another url */
defferreds.push(
$soap.ajax({
type: "POST",
dataType: "json",
url: "some_url.php",
cache: false,
}).done(function(data) {
/* do something */
}).fail(function(jqXHR,status, errorThrown) {
console.log(jqXHR.responseText);
})
);
}
$('.run_ajaxes').click(function(){
run_ajaxes();
});
我为您做了一个非常简单的解决方案。在这里,我有一个outpu
DIV用于进度报告,并且两个按钮abort
在单击时将中止所有仍在运行的请求,而continue
按钮将恢复执行中止请求的执行。
要测试解决方案,请首先按continue
按钮。我使用https://httpbin.org/delay模型服务器来模拟请求。在还有一些运行请求时,请按abort
按钮。而且再次按continue
按钮 - 这将启动所有撤消请求的执行。
var output = $("#output");
var ajaxes = [];
var count = 10;
// Function which will run the ajax call
function run(idx) {
// Get the ajax args
var args = $.extend({}, ajaxes[idx]);
// Run the ajax and replace the args with ajax deferred
ajaxes[idx] = $.ajax(args)
.done(function() {
$(output.find("p")[idx]).html("done");
})
.fail(function() {
$(output.find("p")[idx]).html("aborted");
// Replace the ajax deferred with the original ajax args
ajaxes[idx] = args;
});
}
for(var i = 0; i < count; i++) {
// Create output element to report progress for each ajax call
output.append("<p>sleeping</p>");
// Custom delayed response
var delay = Math.floor((Math.random() * 5) + 1);
// Create ajax arguments
var args = {
type: "GET",
dataType: "json",
url: "https://httpbin.org/delay/" + delay
};
// Store the ajax args
ajaxes[i] = args;
}
$("#abort").on("click", function() {
for(var i = 0; i < count; i++) {
// Abort each undone ajax call
if(ajaxes[i].readyState != 4) {
ajaxes[i].abort();
}
}
});
$("#continue").on("click", function() {
for(var i = 0; i < count; i++) {
// Run all ajax call that where not finished yet
if(!ajaxes[i].readyState) {
$(output.find("p")[i]).html("... loading");
run(i);
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="continue">continue</button>
<button id="abort">abort</button>
<div id="output"></div>