Abbruch einer Batch Ajax Funktion und Neustart mit neue URLs
-
Hallo liebes C++ Forum
Ich arbeite gerade an einem kleinen Service, der ein Set an URLs bekommt und diese in eine bestimmte Anzahl an Teilsets aufsplittet. Danach wird jede URL des Teilseits mit einem AJAX Request geladen. Wenn alle Requests des Teilsets fertig sind, wird das nächste Teilset aufgerufen, bis alle durch sind. Am Ende wird einfach alles angezeigt.
Wird die Funktion
getPosts()
allerdings wieder aufgerufen (mit anderen URLs natürlich), während die vorherigen Teilseits noch nicht abgearbeitet sind, sollen alle vorherigen Abläufe und Requests abgebrochen werden, und nur noch die neuen URLs aufgerufen werden.Was ich bisher hab (als groben "Pseudocode"):
function render() { const postUrls = [ ['https://jsonplaceholder.typicode.com/posts/0', 'https://jsonplaceholder.typicode.com/posts/1'], ['https://jsonplaceholder.typicode.com/posts/2', 'https://jsonplaceholder.typicode.com/posts/3'] ]; getPosts(postUrls).done(results => /* glorious rendering */); } // neues file let mainPromise = $.Deferred(); let isBatchRunning = false; function getPosts(urls) { let batchIndex = 0; let postStore = []; const updatePostStore = (posts) => { batchIndex++; postStore = postStore.concat(posts); if (batchIndex === urls.length) { isBatchRunning = false; // wir sind fertig mainPromise.resolve(postStore); } else { // next URLs Set batchAjax(urls[batchIndex]).then(updatePostStore); } } // brich vorherige Requests ab if (isBatchRunning) { mainPromise.reject(); mainPromise = $.Deferred(); batchIndex = 0; } batchAjax(urls[batchIndex]).then(updatePostStore); } function batchAjax(urlSetPromisesArray) { const deferred = $.Deferred(); // jeder Eintrag in urlSetPromisesArray in ein $.Deferred() promise // mit den entsprechenden Requests aus dem aktuellen batch $.when(urlSetPromisesArray).then(posts => { deferred.resolve(posts); }); return deferred; }
Ich dachte an eine "globale" Variable, die auf
true
gesetzt wird, solange die FunktiongetPosts()
ausgeführt wird. Sind alle Requests fertig,mainPromise
wird resolved und diese Variable wird wieder auffalse
gesetzt. Wird dann die Funktion wieder aufgerufen, und die Variable ist auftrue
, würde ich versuchen alles abbrechen zu wollen.Nur wie? Es laufen bei mir aktuell immer die alten und die neuen Requests los. Für jeglichen Tipp bin ich super dankbar!
PS: Und ja, es sollte genau so arbeiten, um unnötige Requests zu unterbinden. Im Zweifelsfall sind es mehrere hundert Sachen, die angefragt werden