2017-12-14 9 views
1

Ich habe den üblichen AJAX-Pool implementiert, aber wenn ich alle Anfragen abbringe, bricht es sie in Schritten von 2 Anfragen ab, dh. erste, dritte, fünfte ... Dies ist im Grunde, was ich tue:Alle AJAX-Anfragen abbrechen

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
    $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR, text) { 
    // Remove a completed request from the array 
    var index = $.xhrPool.indexOf(jqXHR); 
    if (index > -1) { 
     $.xhrPool.splice(index, 1); 
    } 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
    // Remove a error request from the array 
    var index = $.xhrPool.indexOf(jqXHR); 
    if (index > -1) { 
     $.xhrPool.splice(index, 1); 
    } 
    } 
}); 

function abortAll() { 
    $.each($.xhrPool, function(key, value) { 
    value.abort(); 
    }); 
} 

Wenn ich einen console.log(value) innerhalb des $.each tun, einige von ihnen sind nicht definiert. Wenn ich eine console.log($.xhrPool) vor der $.each mache, sehen sie alle ok aus.

Was fehlt mir?

+0

Wie Sie sie sind abgebrochen, sind die vollständige und Fehler-Callback synchron geschieht ? Ich würde nicht erwarten, aber, vielleicht, –

+0

Sie können stattdessen vollständig verwenden, um das Element zu entfernen, um Ihren Code DRY zu halten. –

Antwort

1

Basierend auf Gaby aka G. Petrioli answer, der beste Weg, um dieses Problem zu lösen, tatsächlich ist es, ein neues Array Schleife über zu schaffen:

function abortAll() { 
    // copying-an-array-of-objects-into-another-array-in-javascript 
    // https://stackoverflow.com/questions/16232915 
    var calls = Array.from($.xhrPool); 

    $.each(calls, function(key, value) { 
    value.abort(); 
    }); 
} 
+0

Das Erstellen einer statischen Instanz von xhrPool mit Array.from hat den Trick gemacht –

2

Zunächst einmal die complete wird auch nach einem error aufgerufen, so dass Sie nicht beide behandeln müssen, wenn Sie das gleiche tun.

Zweitens, wenn Sie die error und complete werden aufgerufen abbrechen, so dass die anfängliche Array geändert wird, während Sie über sie iterieren (im $.each), die ein schlechtes Muster im Allgemeinen.

Also in Ihrem each Sie am ersten Element sind, brechen Sie es (und das Array ändern das Element zu entfernen), dann gehen Sie auf das Element mit dem Index 2, die vorher dritten aber jetzt 2. Da das ist 1. wurde entfernt.

 
Array      each index    target 
[xhr1, xhr2, xhr3, xhr4]  0      xhr1 
[xhr2, xhr3, xhr4]    1      xhr3 
[xhr3, xhr4]     2      undefined 
+0

Verwenden Sie Javascript kann mehrere Skripts parallel ausführen? Ist dies nicht der Fall, ist es nicht möglich, dass der Fehler noch vollständig ausgeführt wird, während abortAll –

+1

@ErikPhilips nicht parallel ausgeführt wird. Innerhalb der jquery '.abort()' Methode wird '.complete()' aufgerufen. –

+0

Gotcha, du hast Recht, ich sehe was du jetzt sagst. Sie sollten wahrscheinlich eine codierte Antwort enthalten, um das Problem zu lösen. –

Verwandte Themen