2016-11-24 56 views
0

好傢伙後,AJAX繼續/恢復中止

我想問一下,如果有任何可能繼續中止阿賈克斯。我arraz Ajax調用的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); 
    }) 
); 

有喜歡的defferreds陣列中的20多個AJAX(ES)。當用戶點擊abort_ajax按鈕時,它應該中止所有尚未完成的ajaxes。我使用這個功能來做到這一點:

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按鈕,它應該從defferreds數組中調用剩餘的ajaxes並完成它們。問題是,我沒有線索如何開始中止阿賈克斯,即使我已經存儲在我的數組dehuerred。 是否有可能恢復中止阿賈克斯?只有那些被墮胎的人而不是那些已經成功的人結束了?

編輯: 林,詢問是否有可能重新運行不僅沒有完成ajaxes。我嘗試了here中使用的解決方案,但它不能解決我的具體問題。一旦我對resume_ajax按鈕沒有點擊是即使我用這個代碼:

$('.resume_ajax').click(function(){ 
    for (var key in defferreds){ 
     $soap.ajax(defferreds[key]); 
    } 
}); 

什麼是再次呼籲中止ajaxes的準確代碼行?它可以通過在我的defferreds數組中看起來像ajax的調用來實現嗎?正如我所說,沒有任何事情發生。

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模型服務器來嘲笑請求。在按下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