NEWS
js callback asynchron problem
-
@hanss
du könntest den Aufruf des 2.setRT ebenfalls in einen Callback mit settimeout setzen, dann werden die Aufrufe zumindes in gleicher Reihenfolge auf den Stack geschrieben.
Allerdings kann die Abarbeitung innerhalb des Callbacks unterschiedlich lange ausfallen. Von daher hast du keine Garantie, das hier genau die gleiche Reihenfolge eingehalten wirdsetTimeout(function(){ setRT(index,element,SollTemp_akt) log("Raumzähler: "+Raumctr+" Index: "+RaumIndex) },10);
kann man in den Skripten setState nicht auch synchron aufrufen?
-
@OliverIO
Vielen Dank, aber Deine Lösung ist nicht sicher, weil zeitabhängig.
Ein synchroner setState wäre die Lösung, das hätte mir zwei Tage rumprobieren erspart. -
@hanss wie gesagt bei asynchron gibt es keine garantierte abfolge.
evtl beschreibst du mal was du am ende erreichen möchtest, evtl ist dein bisheriger lösungsweg nicht optimal
-
Eventuell sind die neuen async-Funktionen in 4.8.x was für dich @hanss
https://forum.iobroker.net/topic/36999/neu-diverse-async-funktionen-im-javascript-adapterDamit lässt sich der Programmablauf trotz asynchronität schön steuern. Ich hab den obigen Schnipsel mal entsprechend umgebaut. Beachte das
async
vor der Funktion undawait setStateAsync
:async function raumzaehler() { var Raumctr = 0; // Schleife für jeden Raum ###################################### for (let i = 0; i < S_Raum.length; i++) { const element = S_Raum[i]; if (SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw) { await setStateAsync(Out_Root + D_Raum[index] + ".Man", SollTemp_akt, true); setRT(index, element, SollTemp_akt); // function setRT wg. Callback log("RaumzählerCB: " + Raumctr + " Index: " + RaumIndex); } else { setRT(index, element, SollTemp_akt); log("Raumzähler: " + Raumctr + " Index: " + RaumIndex); } } // Schleife für jeden Raum ###################################### // ########## Script soll hier fortfahren, wenn Schleife für jeden Raum durchlaufen ist. ########## log("Raumzähler nach allen Räumen: " + Raumctr + " Index: " + RaumIndex); } // Funktion aufrufen nicht vergessen! raumzaehler();
-
ich habe immer wieder probleme mit dem async und await - toll wäre es, wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde - nur halt für dieses thema
-
-
@AlCalzone danke werd ich mal durcharbeiten
-
@liv-in-sky sagte in js callback asynchron problem:
....wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde....
gibt es dazu einen Link?
-
-
@liv-in-sky cool, Danke!
-
Async und await machen aus asynchronen Funktionen wieder synchrone Funktionen.
Das will er ja nicht -
Hier mal ein kurzer Artikel, der auf einen Punkt eingeht, der die Funktionsweise der asynchronen Funktionen (callback oder auch promise basiert) erklärt
https://dev.to/steelvoltage/if-javascript-is-single-threaded-how-is-it-asynchronous-56gd
-
@OliverIO
Vielen Dank, ich habe das jetzt so gelöst:In die Funktion setRT() einen Raumzähler und das Script eingefügt, wenn alle Räume durchlaufen sind:
Das ist sehr übersichtlich und nicht so kompliziert wie async und await.
Ich glaube, das kapier ich nicht mehr.setRT() { Raumctr++ //mein Script if (S_Raum.length == Raumctr){ // letzter Raum // Script hier, wenn alle Räume durchlaufen sind Raumctr=0 } }
-
@OliverIO wieso nicht? Wenn man etwas ausführen will, nachdem asynchrone Vorgänge durch sind, ist async/await genau das richtige Mittel.
Und IMO intuitiver als der callback Krempel. Nach dem Aufruf mit await ist es einfach fertig. -
@AlCalzone
Ah hatte einer seiner Antworten falsch interpretiert. Hab nochmal gelesen.
Wenn er mit seiner Lösung nun zufrieden ist, ist ja alles gut