阿贾克斯继续/流产后继续/恢复



你好,

我想问是否有可能继续流产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>

最新更新