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.
Ist der Callback registriert, kann man mit der Funktion
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):
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
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