Synchrone forEach-Schleife (warten, bis es zu Ende)
Habe ich eine Funktion in Node.js das dauert in ein array und durchläuft es, dabei etwas zeitaufwändige Berechnungen, die auf jedes element.
Hier ist ein super-vereinfachten version der Funktion:
var analyze_data = function (data) {
data.forEach(function (elm) {
if (elm.myProp == true) {
return true;
}
});
return false;
}
Im wesentlichen, die Funktion soll true zurückgeben, wenn alle der Elemente " - Eigenschaft myProp
ist gleich true. Wenn keines der Elemente, die diese Bedingung erfüllen, sollte die Funktion false zurück.
Jedoch, der code wartet nie für die forEach-Schleife zu beenden. In anderen Worten, wenn das 100-element in das array erfüllt die Bedingung, die Funktion sollte true zurückgeben. Stattdessen springt return false;
aus und gibt false zurück, bevor die forEach
Schleife hat Zeit fertig zu stellen.
Ist es eine Lösung für dieses?
Bearbeiten
So erkannte ich, dass ich vereinfachte meine Frage - ich bin tatsächlich mit der Node.js Paket es6-Versprechen, und mein code sieht dann immer so aus:
var analyze_data = function (data) {
return new Promise(function (resolve, reject) {
data.forEach(function (elm) {
if (elm.myProp == true) {
resolve(elm);
}
});
resolve(false);
});
}
So, in Wirklichkeit, ich habe nicht das Problem der Rückgabe einen Wert im forEach-Funktion eher als die äußere Funktion. Beachten Sie darüber hinaus, wie die Funktion löst, um das element selbst, anstatt true, ansonsten false. Eigentlich möchte ich wieder einige relevanten Daten, wenn das eine der Elemente geht die Bedingung, andernfalls false, um anzugeben, dass Sie alle gescheitert.
Irgendwelche Ideen jetzt? :p vielen Dank Auch für all die Antworten!
Q.all
zum Beispiel. github.com/kriskowal/q/wiki/API-Reference#promiseallSie einfach nur wieder den wahren Wert in einem falschen Ort, versuchen Sie es mit
Array.prototype.some
InformationsquelleAutor apparatix | 2014-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht eine Frage der sync/async-Ausführung. Was Sie tun, ist die Rückgabe true, in der für jede callback (unsichtbar für Ihre
analyze_data
- Funktion), dann false zurückgeben, nach dem forEach ist fertig.Müssen Sie
Array.der Prototyp.einige
:InformationsquelleAutor manji
Dein problem ist nicht die Tatsache, dass forEach ist async, weil es nicht ist. Aber weil Sie versehentlich eine für eine andere Rückkehr.
Kehren Sie zurück
true
vom Rückruf nicht von deiner main-Funktion.forEach genannt forEach-denn es führt für jedes element im array, Sie kann nicht aufhören in der Mitte. Hier der Auszug aus Dokumentation:
InformationsquelleAutor exebook
Das Problem ist, dass Sie wieder von Ihrem innere Funktion der Wert true ist, aber nicht, indem Sie es in die äußeren Funktion. Wenn Sie es so machen, sollte es funktionieren:
Gerade jetzt haben Sie zwei Funktionen:
EDIT:
Du jetzt (eventuell) die Lösung zu
elm
, aber IMMER nach, dass die Lösung zufalse
. Ich bin mir nicht 100% sicher, dass auf das Verhalten, aber ich würde vermuten, dass das später die erste überschreibt. Also nochmal, müssen Sie Folgendes prüfen:Natürlich, es scheint, wie Sie tun sollten:
Also können Sie tun:
Könnte sein, mein Verständnis ist, dass er denkt das ist das problem, aber unter den gegebenen Beispiel scheint es, ist es mehr wahrscheinlich einfach nicht die Erfassung der Rückgabewert
Wenn Sie einen Blick auf die edit-ich habe gerade, wie es scheint, ist die Funktion einfach false zurückgeben, ohne zu warten, für die forEach-Schleife fertig Durchlaufen
InformationsquelleAutor dave