JS: Erhalte innere Funktionsargumente in asynchronen Funktionen und führe Callback aus

8

Ich versuche, die Funktion zu schreiben, die alle Ergebnisse von asynchronen Funktionen zurückgibt und einen Rückruf ausführt, der in ein Array drückt und das Ergebnis jeder asynchronen Funktion protokolliert.

Als Kellner, der alle Gerichte bringt, wenn sie fertig sind. Ich verstehe nicht, wie man die Kind-Argumente erhält, die als Ergebnis zurückgegeben werden sollen. Der Code der Aufgabe und meine nicht funktionierende Lösung ist unten:

Die Aufgabe:

%Vor%

Meine nicht funktionierende Lösung:

%Vor%     
mailman_73 25.12.2016, 11:45
quelle

2 Antworten

5

Problem ist dieser Teil:

%Vor%

was eine synchrone Funktion ist. Wenn Sie if(i == 2) überprüfen, überprüfen Sie im Grunde, dass Sie alle asynchronen Funktionen aufgerufen haben, aber sie haben noch nichts zurückgegeben. Sie wissen also nur, dass die Funktionen aufgerufen wurden, aber result.arr ist noch nicht ausgefüllt.

Sie müssen den doneAll(result.arr) Ausdruck in child Callback verschieben, dann wird er von der async Funktion aufgerufen, da er das Ergebnis zurückgibt.

Die einfachste Lösung, die ich mir vorstellen kann, ist das Schreiben von child as

%Vor%

und in Ihrer waiter Funktion Ergebnisobjekt verbessern

%Vor%

Das soll funktionieren, hat aber einen Nachteil - die Position der Ergebnisse hält die Position der Funktionen nicht in funcArray , die Position der Ergebnisse ist nach der Dauer der asynchronen Funktion sortiert, einfach die erste aufgelöste würde das erste Ergebnis usw. annehmen Dies ist ein Problem. Sie müssen auch einen Index an Ihre child -Funktion übergeben, um das Ergebnis an einer wertvollen Position im Ergebnisarray zu speichern, und dann würde die Überprüfung durch arr.length nicht funktionieren, weil JS-Array die Länge als höchsten Index + 1 zurückgibt Wenn Ihre letzte funcArray zuerst erfüllt würde, würde sie den letzten Index füllen und die Länge von result.arr wäre gleich this.allCount . Um die Reihenfolge des Ergebnisses gleich dem funcArray zu halten, müssen Sie die Nummer speichern der zurückgegebenen Ergebnisse als eine andere Zahl, erhöhen Sie diese Zahl mit jedem neuen Ergebnis und vergleichen Sie diese Zahl mit allCount .

Oder verringern Sie allCount wie folgt

%Vor%

Und ändern Sie Ihre Funktion waiter

%Vor%     
Vaclav 25.12.2016, 12:46
quelle
0

Warum nicht Versprechen ?

%Vor%

Ihre Funktion waiter :

%Vor%

Und du kannst es so benutzen

%Vor%

Viel einfacher zu verstehen. Richtig?

    
Octopitus 25.12.2016 13:15
quelle

Tags und Links