• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Verständnisproblem asynchrone Aufrufe

PeterM1

New member
Hallo JavaScript-Profis!

ich habe ein Problem, das ich mit meinem aktuellen Kenntnisstand leider keiner Lösung zuführen kann und bitte um Unterstützung. Ich will versuchen, das Problem zu beschreiben:

Ich habe folgende Programmstruktur (javascript im Browser).

Das Objekt myConnection ermöglicht es, einen Callback für das Sammeln von Daten zu registrieren. Das geschieht so.
Code:
[B]myConnection[/B].on(on_answer, callbackFunction(value1, value2)) {
})

Ist der Callback registriert, kann man mit der Funktion

Code:
[B]myConnection[/B].startCollecting();

die Verbindung benachrichtigen, dass mit dem Sammeln von Daten begonnen werden kann. Daraufhin wird die Funktion callbackFunction() irgendwann und mehrfach asynchron aufgerufen, bis alle Daten gesammelt wurden. Es ist nicht möglich, das Ende des Sammelns zu ermitteln, da die Quellen vonainander nichts wissen. Man muss also warten, bis keine Quelle mehr sendet. Das ist hier aber nicht das eigentliche Problem.

Ziel ist es, die gesammelten Daten in einem Array vorzuhalten.

Ich habe nun folgendes versucht (schematisch):
Code:
var promises = [];

myConnection.connect();

myConnection.on(on_collect, callbackFunction(value1, value2) {
  console.log('callback hat Daten empfangen', value1);
  const result = new Promise(resolve => { 
    const data = { value1: value1, value2: value2 }
  });
  promises.push(result);
});

myConnection. startCollecting();

Promise.all(promises).then(
  (values) => { console.log(values); }
);

folgendes passiert:

120ms myConnection.connect OK
140ms myConnection.on hat Callback registriert
160ms myConnection.startCollecting() OK
180ms Promise.all().then hat keine Daten ->promises[] ist leer

200ms callback hat Daten empfangen 1
210ms callback hat Daten empfangen 2
...

Das verstehe ich nicht. Sollte Promise.all().then() nicht warten, bis alle Daten asynchron eingegangen sind? Stattdessen wird Promise.all() sofort ausgeführt und findet natürlich keine Daten, da callbackFunktion() noch keine Daten geliefert hat.

Wo liegt mein Denkfehler? Kann mir jmd. vielleicht einen Tipp geben?

Viele Grüße
Peter
 
Promise.all nimmt einfach den Array und schaut welche Promises da drin sind. An der Stelle, wo du das aufrufst, ist das Array leer und deswegen funktioniert das nicht. Somit sind Promises hier nicht der richtige Weg, da du ja nicht weißt, auf wie viele Promises zu eigentlich warten musst.

Wenn du kein Event hast, das dir anzeigt, wann alle Daten da sind, gibt es nur die Möglichkeit, das über ein Timeout zu machen. Also bei jedem Event startest du einen Timeout, den du beim nächsten wieder cancelst. Wenn also eine bestimmte Zeit keine Daten mehr kommen, gehst du davon aus, dass alle da sind.
 
Zurück
Oben