JQuery Queue in loop erstellen

BurnerR

Bot #0384479
Registriert
20 Juli 2013
Beiträge
5.311
Ich habe hier ein Problem mit JS, bzw. Jquery.
Ich erstelle in einer for-Schleife einen JQuery Queue bestehend aus Funktionen. Die Funktion erhält als Parameter Arrayelemente basierend auf den lokalen Zählvariablen.
Allerdings werden diese Parameter offenbar erst evaluiert, wenn die Funktion an sich ausgeführt wird:

[src=javascript]
for (var index = 0, len = spritearray.length; index < len; ++index) {
var theQueue = $({}); // jQuery on an empty object
var arraynumber = index;
func = function(next){ startSprite(arraynumber, next) }
theQueue.queue('test', func);
}
theQueue.dequeue('test'); // start queue
[/src]

In der Zeile
[src=javascript]func = function(next){ startSprite(arraynumber, next) }[/src]
Gewollt ist also ein Queue bestehend aus:
[src=javascript]
function(next){ startSprite(0, next) }
function(next){ startSprite(1, next) }
function(next){ startSprite(2, next) }
[/src]

Was ich aber erhalte ist:
[src=javascript]
function(next){ startSprite(2, next) }
function(next){ startSprite(2, next) }
function(next){ startSprite(2, next) }
[/src]

Wie kann ich das korrekt machen?
Analog dazu, wenn ich die Zeile
[src=javascript] var arraynumber = index;[/src]
weglasse, dann meldet er 'index is undefined', weil die laufvariable da dann wohl schon zerstört ist.
Wie kann ich JS also sagen, dass er dann später startSprite mit den Werten 0,1,2,..N aufrufen soll?
 
Der `arraynumber` Fehler sollte dich eigentlich in die richtige Richtung lenken und ich hoffe ich liege hier nicht komplett falsch.

Die Funktion wird übergeben, als Parameter, an jquery´s core, wird also vollkommen aus dem Kontext gerissen, dadurch existiert die variable `index` auch nicht mehr. Durch ein umdefinieren von `index` in `arraynumber` existiert zwar dann `arraynumber`, diese wurde aber mehrfach überschrieben, durch `index`. `arraynumber` ist also immer `spritearray.length`, weil die funktion ja nich in der schleife ausgeführt wird, wenn die Schleife bereits fertig durchlaufen ist.

Kannst du vielleicht etwas mehr erklären was du vor hast, dann könnte man nach Auswegen suchen.
 
Muß es eine jQuery Queue sein? Zwingend?
Dann ignoriere den Hinweis der jetzt kommt bitte. :)


Ansonsten vielleicht so etwas hier in Form einer verketteten Liste?

[src=javascript]// Temporary data holder
var spriteList = [];

// Generator

function generateSprite(index, previous, next) {
var sprite = {};
sprite.index = index;
sprite.previous = previous;
sprite.next = next;

sprite.getIndex = function() {
return this.index;
}

sprite.nextSprite = function() {
return this.next;
}

sprite.previousSprite = function() {
return this.previous;
}

return sprite;
}


// Generation
var previousSprite = null;
for (var index = 0; index < 10; index++) {
var generatedSprite = generateSprite(index, null, null);
spriteList.push(generatedSprite);

if (previousSprite) {
previousSprite.next = generatedSprite;
generatedSprite.previous = previousSprite;
}

previousSprite = generatedSprite;
}


// Cleanup
spriteList.splice(1, spriteList.length-1); // Optional, aber nur wenn man über den Index nicht auf andere Sprites mehr zugreifen koennen muss.



// Iteration
var currentSprite = spriteList[0];
while (currentSprite) {
console.log("my index is: " + currentSprite.getIndex());

if (currentSprite.previousSprite()) {
console.log("the previous is: "+currentSprite.previousSprite().index);
}

if (currentSprite.nextSprite()) {
console.log("the next is: "+currentSprite.nextSprite().index);
}

currentSprite = currentSprite.nextSprite();
}[/src]
 
Zuletzt bearbeitet:
Das Problem ist, dass der Wert erst bei der Ausführung genutzt wird. Wenn du ihn kopieren willst, kannst du eine selbstaufrufende anonyme Funktion schreiben:

[src=javascript]func = (function(value) { return function(next) { startSprite(value, next); })(arraynumber);[/src]
 
Zurück
Oben