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:
Hier meine Version, welche allerdings nicht ganz klappt:
Die "finish"-Funktion rufe ich immer auf, wenn die "success"-Funktion komplett fertig ist.
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.