2016-11-24 2 views
0

Hallo Jungs,AJAX fortsetzen/resume nach Abbruch

ich möchte fragen, ob es eine Möglichkeit ist, abgebrochene Ajax fortzusetzen. Ich habe arraz von Ajax-Aufrufe in defferreds wie folgt aus:

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

Es gibt wie 20 weitere Ajax (n) in der defferreds Array. Wenn der Benutzer auf die Schaltfläche abort_ajax klickt, sollte er alle Ajaxs abbrechen, die noch nicht erledigt sind. Ich verwende diese Funktion, um dies zu tun:

Hier geht der Teil, wo ich brauche deine Hilfe. Sobald der Benutzer auf die Schaltfläche resume_ajax klickt, sollte er die verbleibenden Ajaxes aus dem defferreds-Array aufrufen und vervollständigen. Das Problem ist, dass ich keine Ahnung habe, wie man abgebrochenen Ajax startet, obwohl ich es in meinem Array von Defferreds gespeichert habe. Ist es möglich abgebrochene Ajaxen fortzusetzen? Und nur diejenigen, die abgebrochen wurden und nicht diejenigen, die erfolgreich beendet wurden?

EDIT: Im fragen, ob es die Möglichkeit nicht nur abgeschlossen ajaxes erneut auszuführen ist. Ich habe die Lösung ausprobiert, die in here verwendet wird, aber es löst nicht mein konkretes Problem. Sobald ich resume_ajax Taste nichts klicken Sie geschieht, obwohl ich diesen Code verwendet:

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

Was ist die genaue Codezeile, die wieder abgebrochene ajaxes nennt? Kann es sogar mit einem Ajax-Ruf erreicht werden, der wie einer in meinem Defferreds-Array aussieht? Denn wie gesagt, nichts ist passiert.

EDIT2:

Ich betreibe die ajaxes wie folgt aus:

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

Mögliche Duplikat [weiter einen abgebrochen AJAX (jqXHR) request] (http://stackoverflow.com/questions/18837293/continue-an-aborted-ajax-jqxhr-request) –

+0

Ich denke, Sie müssen die Ajax-Optionen erneut übergeben und es erneut ausführen. – maheshiv

+0

Da Sie ein Array haben, können Sie den Status jedes Ajax in Ihrem Array speichern. So können Sie die abgebrochenen erkennen und wieder anrufen ... – EhsanT

Antwort

1

ich für Sie eine sehr einfache Lösung gemacht. Hier habe ich eine outpu div für die Fortschrittsberichterstattung, und zwei Schaltflächen, abort, die beim Klicken auf alle noch laufenden Anforderungen abgebrochen wird, und continue Schaltfläche, die die Ausführung von abgebrochenen Anfragen fortsetzen wird. Um die Lösung zu testen, drücken Sie zuerst die Taste continue. Ich benutzte https://httpbin.org/delay Mockup-Server für das Mocking der Anfragen. Drücken Sie dann die Taste abort, während noch einige Anfragen laufen. Und als Presse continue Taste erneut - dies wird die Ausführung aller rückgängig gemacht requests.Here starten Sie den Code ist

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

Ihr Willkommen, froh zu helfen – xxxmatko