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 Funktion getPosts() ausgeführt wird. Sind alle Requests fertig, mainPromise wird resolved und diese Variable wird wieder auf false gesetzt. Wird dann die Funktion wieder aufgerufen, und die Variable ist auf true , 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 🙂


Log in to reply