2016-11-24 2 views
0

операций по прекращению Привет, ребята,AJAX продолжить/резюме после

я хотел бы спросить, есть ли возможность продолжить прерванную Аякса. Я получил arraz Аякса звонков в defferreds так:

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); 
    }) 
); 

Есть как больше 20 Ajax (ов) в массиве defferreds. Когда пользователь нажимает кнопку abort_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]; 
     } 
    } 
} 

Здесь идет часть, где мне нужна ваша помощь. Как только пользователь нажимает кнопку resume_ajax, он должен вызывать оставшиеся ajaxes из массива defferreds и завершить их. Проблема в том, что я не знаю, как начать прерванный аякс, даже если я его сохранил в моем массиве дефферва. Можно ли возобновить прерванные аяксы? И только те, которые были прерваны, а не те, которые успешно завершились?

EDIT: Im с просьбой, если есть возможность повторно только не завершенные ajaxes. Я попробовал решение, которое используется в here, но это не решает мою конкретную проблему. После того, как я нажимаю на resume_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(); 
}); 
+0

Возможного дубликат [Продолжить прерванный запрос AJAX (jqXHR)] (HTTP://stackoverflow.com/questions/18837293/continue-an-aborted-ajax-jqxhr-request) –

+0

Думаю, вам нужно снова передать параметры ajax и повторно запустить его. – maheshiv

+0

Поскольку у вас есть массив, вы можете сохранить статус каждого ajax в своем массиве. Таким образом, вы можете обнаружить прерванные и снова называть их ... – EhsanT

ответ

1

Я сделал очень простое решение для Вас. Здесь у меня есть один outpu div для отчета о проделанной работе, а две кнопки abort, которые при нажатии будут отменены все еще выполняющиеся запросы, и кнопка continue, которая возобновит выполнение прерванных запросов.

Чтобы проверить решение, нажмите кнопку continue. Я использовал https://httpbin.org/delay mockup-сервер для издевательств над запросами. Затем нажмите кнопку abort, пока еще есть некоторые запросы на запуск. И чем пресса continue кнопку еще раз - это будет начать выполнение все отмененного requests.Here это код

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() { 
 
    \t $(output.find("p")[idx]).html("done"); 
 
    }) 
 
    .fail(function() { 
 
    \t $(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++) { 
 
    \t // Abort each undone ajax call 
 
    if(ajaxes[i].readyState != 4) { 
 
     ajaxes[i].abort(); 
 
    } 
 
    } 
 
}); 
 

 
$("#continue").on("click", function() { 
 
    for(var i = 0; i < count; i++) { 
 
    \t // Run all ajax call that where not finished yet 
 
    if(!ajaxes[i].readyState) { 
 
    \t $(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>

+1

Ваш прием, рад помочь – xxxmatko