Ergebnis 1 bis 2 von 2
  1. #1
    PeterM1 ist offline Grünschnabel
    registriert
    22-09-2020
    Beiträge
    1

    Verständnisproblem asynchrone Aufrufe

    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:
    myConnection.on(on_answer, callbackFunction(value1, value2)) {
    })
    Ist der Callback registriert, kann man mit der Funktion

    Code:
    myConnection.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

  2. #2
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.750

    AW: Verständnisproblem asynchrone Aufrufe

    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.

Ähnliche Themen

  1. IE8 blockt PHP-Aufrufe
    Von bermany im Forum Allgemeines
    Antworten: 7
    Letzter Beitrag: 04-03-2014, 21:37
  2. Asynchrone Datenbank und Event pagebeforeshow
    Von tomtom50 im Forum JavaScript
    Antworten: 5
    Letzter Beitrag: 26-07-2011, 14:14
  3. Asynchrone Anfrage an Server mittels JSP
    Von xplox im Forum Serverseitige Programmierung
    Antworten: 3
    Letzter Beitrag: 16-12-2008, 11:47
  4. Mehrere .js Aufrufe in einem <script> Aufruf möglich?
    Von gessi2000 im Forum JavaScript
    Antworten: 7
    Letzter Beitrag: 08-04-2003, 12:36
  5. Andere Perl aufrufe informaieren
    Von kakalake im Forum Serverseitige Programmierung
    Antworten: 0
    Letzter Beitrag: 30-04-2001, 13:09

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •