• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ajax queue erweitern

yss

Mitglied
Guten Tag

Ich habe folgenden "Manager" von Stackoverflow, welcher Ajax-Requests in eine Warteschleife setzt und diese dann nacheinander abarbeitet. Allerdings besteht das Problem, dass der nächste Request schon abgesetzt wird bevor die "success"-Funktion vom vorherigen fertig ist.
Nun wollte ich den Manager selber erweitern, allerdings hab ich es nicht so mit Objektorientierung in Javascript.
Mein Plan: Eine Statusvariable einbauen, welche das Ausführen des nächsten Requests erlaubt bzw. verbietet.

Hier das Original:
Code:
var ajaxManager = (function() {
     var requests = [];


     return {
        addReq:  function(opt) {
            requests.push(opt);
        },
        removeReq:  function(opt) {
            if( $.inArray(opt, requests) > -1 )
                requests.splice($.inArray(opt, requests), 1);
        },
        run: function() {
            var self = this,
                oriSuc;

            if( requests.length ) {
                oriSuc = requests[0].complete;

                requests[0].complete = function() {
                     if( typeof(oriSuc) === 'function' ) oriSuc();
                     requests.shift();
                     self.run.apply(self, []);
                };  

                $.ajax(requests[0]);
            } else {
              self.tid = setTimeout(function() {
                 self.run.apply(self, []);
              }, 1000);
            }
        },
        stop:  function() {
            requests = [];
            clearTimeout(this.tid);
        }
     };
}());

Hier meine Version, welche allerdings nicht ganz klappt:
Code:
var ajaxManager = (function() {
     var requests = [];
     var status = true;
     return {
        addReq:  function(opt) {
            requests.push(opt);
        },
        removeReq:  function(opt) {
            if( $.inArray(opt, requests) > -1 )
                requests.splice($.inArray(opt, requests), 1);
        },
        run: function() {
            var self = this,
                oriSuc;

            if( requests.length ) {
                oriSuc = requests[0].complete;

                requests[0].complete = function() {
                     if( typeof(oriSuc) === 'function' ) oriSuc();
                     requests.shift();
                     self.run.apply(self, []);
                };  
                self.status = false;
                $.ajax(requests[0]);
            } else {
              self.tid = setTimeout(function() {
                 if(self.status){
                     self.run.apply(self, []);
                 }
              }, 500);
            }
        },
        stop:  function() {
            requests = [];
            clearTimeout(this.tid);
        },
        finished: function(){
              this.status = true;
        }
     };
}());

Die "finish"-Funktion rufe ich immer auf, wenn die "success"-Funktion komplett fertig ist.
 
Werbung:
entferne das self. und das this. vor dem "status" und dann sollte es funktionieren.
 
Zurück
Oben