Was ist die callback-und err in async.während Sie verwendet?
Ich versuche, async.während sich zu regenerieren, eine zufällige Zahl zwischen 0 und der Länge des Arrays, bis die Länge des Elements an diesem index ist größer als die angegebene Länge. Ich wollte mit async.während für diese, aber die syntax ist nicht ganz klar für mich. Ich dachte über das tun der folgende:
var selectParagraph = function(paragraphs, callback){
var index = Math.floor(Math.random() * paragraphs.length
async.whilst(
function(){
return paragraphs[index].length < minParagraphLength;
},
function(cb) {
index = Math.floor(Math.random() * paragraphs.length);
},
function(err) {
console.log(paragraphs[index]);
callback(err, paragraphs[index]);
}
}
Aber das funktioniert nicht. Ich vermute, es ist weil ich nicht das cb für die zweite Funktion überall, aber ich nicht genau weiß wie ich es verwenden soll. Kann ich einfach anrufen cb() nach dem ändern der index? Was genau bedeutet die variable err enthält?
- Warum bist du nicht einfach mit einem normalen
while
loop hier? Es scheint nicht, dass Sie machen alle asynchronen Aufrufe. - Ich habe zum ausführen einer callback-nach der while-Schleife wird beendet. Nicht die callback passieren, bevor die normale while-Schleife beendet wird? Ich will hinzufügen, den Rückruf in meinem code-Beispiel für Klarheit.
- Ein
while
- Schleife wie diese ist synchron (es hängt nicht von alle asynchronen Operationen), so können Sie Ihren Rückruf, nachdem es beendet hat. - Warum führen Sie einen Rückruf? Ihrer Funktion tut nichts async, also sollte es nicht brauchen, um einen Rückruf.
- Diese while-Schleife ausgeführt wird, in eine Funktion, die aufgerufen wird, in der main-Funktion, so dass ich ausführen muss, um ein callback mit dem gewählten index der main-Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Bergi hat schon darauf hingewiesen, Sie sind nicht etwas zu tun, asynchrone und brauchen nicht zu verwenden
whilst
überhaupt. Ich werde weitere Adresse, Ihre spezifischen Verwirrung darüber, wiewhilst
funktioniert allerdings.Das zweite argument
whilst
ist eine Funktion durchführen können asynchrone Operationen.whilst
hat keine Möglichkeit zu wissen, wenn die Funktion "fertig" mit allem, was es tun muss. Der parameter callback ist eine Möglichkeit, um das signal zumwhilst
Sie, dass diese Funktion vollständig abgeschlossen hat alle seine Aufgaben, undwhilst
können gehen, um die nächste iteration.Nehmen wir an, wir wollen eine Serie Konsole-Nachricht jeweils eine Sekunde auseinander. (Dies ist ein hübsch erfundenes Beispiel, aber ich kann nicht denken, ein Beispiel, das einfacher zu erklären.)
In diesem Fall nennen wir
setTimeout
und dannwhilst
nicht ausgeführt wird die nächste iteration ein, bis diecb()
heißt in dersetTimeout
Auflösung. Wennwhilst
lief die nächste iteration, sobald die Funktion beendet wird, werden allesetTimeout
fordert, wäre in der Warteschlange zur gleichen Zeit, sondern als das laufen auf der Sekunde nach der anderen. Stattdessen wartet er, bis die Funktion ruftcb()
.Da Sie nie rufen Sie
cb()
im codewhilst
einfach davon ausgegangen, dass die Funktion ausgelöst wurde eine asynchrone Aufgabe, die eine sehr lange Zeit.whilst
wird nicht laufen, die nächste iteration ein, bis das erste Funktionsaufruf bestätigt, dass es ist getan durch den Aufrufcb()
.Einen Anruf zu
cb()
ohne Argumente signalisiert, dass die Funktion abgeschlossen, seine Aufgaben ohne Probleme. Wenn die Funktion beendet sich mit einem Fehler (konnte nicht Datei Lesen, konnte nicht auf einem Netzwerk-Ressource), dann kann man liefern, dass Fehler als argument zucb
(z.B.cb(new Error("could not reach the server"));
) und der Fehler wird zugeführt, um denwhilst
's Dritte Funktion argument.whilst
Schleife geschehen ist, muss in den callback.Ja, genau.
async.js
erwartet, dass Sie rufen Sie zurück, wenn Sie fertig sind, und wenn Sie nicht es nicht weiter mit der nächsten iteration.Sollten Sie nicht verwenden es überhaupt, da tun Sie nichts asynchron. Verwenden Sie ein standard -
do while
Schleife: