Ich habe diesen Code (aus dieser Frage entnommen):
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err)
return done(err);
var pending = list.length;
if (!pending)
return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending)
done(null, results);
});
} else {
results.push(file);
if (!--pending)
done(null, results);
}
});
});
});
};
Ich versuche, ihm zu folgen, und ich glaube, ich verstehe alles, außer gegen Ende, wo es heißt !--pending. Was macht dieser Befehl in diesem Zusammenhang?
Bearbeiten: Ich schätze alle weiteren Kommentare, aber die Frage wurde schon oft beantwortet. Danke trotzdem!
Könnten Sie diesen Code erklären, ich verstehe nicht, warum überprüfen if (!--pending) done(null, results);?
– Schwarze Mamba
17. Dezember 2015 um 1:26 Uhr
Das erinnert mich an den Namen des --> Operator?
– Soner Gönül
17. Dezember 2015 um 11:01 Uhr
Beachten Sie, dass der Anwendungsfall hier trivial mit Versprechungen gelöst werden kann, anstatt unseren eigenen Synchronisationsmechanismus zu erfinden. Diese Funktion führt auch keine korrekte Fehlerbehandlung durch. Aus diesem Grund sollten Sie Ihre eigene Parallelität nicht rollen, es sei denn, Sie haben einen guten Grund.
– Benjamin Grünbaum
19. Dezember 2015 um 13:35 Uhr
TbWill4321
! invertiert einen Wert und gibt Ihnen den entgegengesetzten booleschen Wert:
--[value] subtrahiert eins (1) von einer Zahl und gibt dann diese Zahl zurück, mit der gearbeitet werden soll:
var a = 1, b = 2;
--a == 0
--b == 1
So, !--pending subtrahiert eins von ausstehend und gibt dann das Gegenteil seines Wahrheits-/Falschwerts zurück (unabhängig davon, ob es sich um einen Wert handelt oder nicht 0).
Und ja, folgen Sie dem ProTipp. Dies mag in anderen Programmiersprachen eine gebräuchliche Redewendung sein, aber für die meisten deklarativen JavaScript-Programmierungen sieht dies ziemlich fremd aus.
Amit
Das ist kein spezieller Operator, das sind 2 Standardoperatoren hintereinander:
Ein Präfix-Dekrement (--)
Ein logisches nicht (!)
Dies bewirkt pending zu dekrementieren und dann zu testen, ob es null ist.
Eine Reihe von Antworten beschreibt was dieser Befehl funktioniert, aber nicht warum das wird hier so gemacht.
Ich komme aus der C-Welt und lese !--pending als „Count down pending und prüfen Sie, ob es Null ist”, ohne wirklich darüber nachzudenken. Es ist eine Redewendung, die meiner Meinung nach Programmierer in ähnlichen Sprachen kennen sollten.
Die Funktion verwendet readdir um eine Liste von Dateien und Unterverzeichnissen zu erhalten, die ich gemeinsam “Einträge” nennen werde.
Die Variable pending verfolgt, wie viele davon noch zu verarbeiten sind. Sie beginnt mit der Länge der Liste und zählt bei der Verarbeitung jedes Eintrags abwärts gegen Null.
Diese Eingaben werden möglicherweise nicht in der richtigen Reihenfolge verarbeitet, weshalb es notwendig ist, herunterzuzählen, anstatt nur eine einfache Schleife zu verwenden. Wann alle die Eingaben wurden verarbeitet der Rückruf done wird gerufen, um den ursprünglichen Anrufer über diese Tatsache zu informieren.
Beim ersten Aufruf an done vorangestellt ist return, nicht weil wir einen Wert zurückgeben wollen, sondern einfach, damit die Funktion an diesem Punkt nicht mehr ausgeführt wird. Es wäre sauberer gewesen, den Code zu löschen return und setze die Alternative in ein else.
Lukas
Es ist eine Abkürzung.
! ist nicht”.
-- verringert einen Wert.
So !-- prüft, ob der Wert, der durch Negieren des Ergebnisses des Dekrementierens eines Werts erhalten wird, falsch ist.
Versuche dies:
var x = 2;
console.log(!--x);
console.log(!--x);
Die erste ist falsch, da der Wert von x 1 ist, die zweite ist wahr, da der Wert von x 0 ist.
Randnotiz: !x-- würde zuerst prüfen, ob x falsch ist, und es dann dekrementieren.
Könnten Sie diesen Code erklären, ich verstehe nicht, warum überprüfen
if (!--pending) done(null, results);
?– Schwarze Mamba
17. Dezember 2015 um 1:26 Uhr
Das erinnert mich an den Namen des
-->
Operator?– Soner Gönül
17. Dezember 2015 um 11:01 Uhr
Beachten Sie, dass der Anwendungsfall hier trivial mit Versprechungen gelöst werden kann, anstatt unseren eigenen Synchronisationsmechanismus zu erfinden. Diese Funktion führt auch keine korrekte Fehlerbehandlung durch. Aus diesem Grund sollten Sie Ihre eigene Parallelität nicht rollen, es sei denn, Sie haben einen guten Grund.
– Benjamin Grünbaum
19. Dezember 2015 um 13:35 Uhr