2012-12-23 4 views
5

Ich habe versucht zu verstehen, wie Mike Bostock's queue.js funktioniert, aber ich kann nicht sehen, wie es funktioniert. Der Teil, den ich nicht verstehe, ist, wie der Code es schafft, Callbacks weiter auszuführen. Insbesondere bin ich unsicher bezüglich der Methode pop() (Zeile 45). Aus meiner Sicht nimmt die Methode die nächste unverarbeitete, verzögerte Funktion an; hängt einen Callback an, der (möglicherweise) die nächste verzögerte Funktion in der Warteschlange startet und ausführt, wenn die Funktion sofort beendet wird; führt dann diese Funktion schließlich aus. Meine Frage ist: welcher Code führt diesen Rückruf aus?Wie funktioniert queue.js?

+1

Das ist ein sehr schlecht kommentierter Code. –

+1

@LightnessRacesinOrbit: Es ist ein sehr kurzer und prägnanter Code. Die Variablennamen sind beschreibend und ihre Funktion ist kommentiert. Ich sehe keinen Grund, es zu kommentieren ... – Bergi

+0

@Bergi: Ich frage nur nach, wie, ein oder zwei. Beschreibungen der einzelnen Funktionen Die Frage des OP zeigt die Notwendigkeit auf. –

Antwort

10

Jede zurückgestellte Funktion gibt tatsächlich nichts zurück - sie müssen ihr letztes Argument als Callback ausführen. Zum Beispiel wird diese Arbeit nicht

var foo = function(i) { 
    console.log(i); 
    return i; 
} 
var finished = function(error, results) { 
    console.log(results); 
} 

queue(2) 
    .defer(foo, 1) 
    .defer(foo, 2) 
    .defer(foo, 3) 
    .defer(foo, 4) 
    .awaitAll(finished); // only prints "1" and "2", since foo() doesn't execute callbacks 

Wenn wir jedoch foo modifizieren, um einen Rückruf zu nehmen,

var foo = function(i, callback) { 
    console.log(i); 
    callback(null, i); // first argument is error reason, second is result 
} 

Dann wird es, wie die Callback-Ausführung bewirkt, dass queue fortzusetzen.

+0

Schönes Beispiel, hat mir wirklich geholfen – megatron77

2

Wenn ich den Code richtig verstehen, queue.await() und queue.awaitall() setzten den Rückruf in dem await Instanz-Variable, und dann wird dies durch notify() ausgeführt.