NEWS
async, await mit selector oder schleife????
-
Dein Verständnis ist korrekt.
@ple sagte in async, await mit selector oder schleife????:
warum gibt es dann noch das return new Promise
async/await ist eigentlich "nur" eine hübsche und aufgeräumte Variante mit Promises zu arbeiten, die aussieht wie synchroner Code.
Eine
async
-Funktion gibt implizit einen Promise zurück. Wenn du jetzt aber per await eine Schnittstelle nutzen willst, die mit nicht mit Promises, sondern mit Callbacks arbeitest, musst du die irgendwie auf einen Promise umbiegen. Das geht indem du selbst einen Promise zurück gibst und selbst resolve bzw. reject mit den korrekten Werten aufrufstfunction bla() { return new Promise((resolve, reject) => { // ... mehr code // Funktion, die einen Callback nutzt: callExternalAPI(arg1, arg2, (err, result) => { if (err) { // Bei Fehlern den Promise rejecten (dann throwt await einen Error) reject(err); } else { // Bei Erfolg das Ergebnis zurück geben (geht auch ohne result, wenn die Funktion keinen Wert zurück geben soll) resolve(result); } }); }); }
Die Funktion bla muss dann übrigens nicht als async deklariert werden, weil du in ihr ja kein await nutzt.
-
@alcalzone
Kann man dir irgendwo ne Kaffee ausgeben
Wo ich dich gerade an der Strippe habe, hier ein paar Fragen mehr :-),Ok, also alles was kein async/await unterstützt muss mit
return new Promise((resolve, reject) => {
ausgeführt werden.
Wäre es denn ein gehbarer Weg eine Schrittkette wie folgt aufzubauen?async function neueNummer() { console.log("STEP 10: neue Nummer wurde gelesen") Eingabe_sperren = true console.log("STEP 20: Daten werden gelöscht") await loeschen() console.log("STEP 30: Rezept wird gesucht") await Rezeptsuche() console.log("STEP 40: Stationsdaten werden gelesen") await Daten_lesen() console.log("STEP 50: Metadaten werden geschrieben") await Meta_schreiben() console.log("****************** update gesperrt: " + Eingabe_sperren) }
ich müsste alt nur gucken, wie man es am es macht, das z.B. wirklich erst Step 40 ausgeführt wird, bevor es weiter geht?
In Step 40 habe ich mir sowas z.B. zusammengetrimmert, denke es geht einfacher.
Der Code macht ein Query auf ner MSSQL und soll mir Daten abholen und die in Datenpunkte schreiben. Es wäre wichtig, dass dieses auch komplett ausgeführt wurde, bevor es mit Step50 weitergeht. Kann der sendto async/await oder wie würde man da vorgehen.function Daten_lesen_SQL(Tabelle) { var Data; var i; var Spaltenname; var Data_Column = {}; var DMC_Jahr_Nr = Number(getState("javascript.0.DMC_Kamera.Jahr_Nr").val); var DMC_Tag_Nr = Number(getState("javascript.0.DMC_Kamera.Tag_Nr").val); var DMC_Id_Nr = Number(getState("javascript.0.DMC_Kamera.Id_Nr").val); var sql_string = "USE XXXXXXXXXXXXX SELECT TOP (1) * \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" //console.log(sql_string) sendTo('sql.1', 'query', sql_string, function (result) { if (result.error) { console.error(result.error); } else { Data = ((result.result[0])); for (Spaltenname in Data) { let x = Data[Spaltenname]; let Ergebnis = JSON.stringify(x); if (typeof Data === 'undefined') { log(Tabelle + " keine Daten vorhanden"); } if (typeof Data !== 'undefined') { // States anlegen createState('Daten_lesen.' + Tabelle + '.' + Spaltenname, '', { name: Spaltenname, type: 'mixed', unit: '' }); /* createState('Daten_senden.' + Tabelle + '.' + Spaltenname, '', { name: Spaltenname, type: 'mixed', unit: '' }); */ let Daten = Ergebnis; Daten = Daten.replace('"', ''); Daten = Daten.replace('"', ''); Daten = Daten.replace('Z', ''); if (Daten == 'true') { Daten = true } if (Daten == 'false') { Daten = false } // States beschreiben setState('Daten_lesen.' + Tabelle + '.' + Spaltenname, Daten); } } } } ); }
-
@ple sagte in async, await mit selector oder schleife????:
Kann man dir irgendwo ne Kaffee ausgeben
https://github.com/sponsors/AlCalzone oder https://paypal.me/dgriesel wäre ne Option.
Wäre es denn ein gehbarer Weg eine Schrittkette wie folgt aufzubauen?
Absolut! Wichtig ist es nur, die Kette bei Fehlern abzubrechen, daher am besten alles in try-catch packen:
async function neueNummer() { try { console.log("STEP 10: neue Nummer wurde gelesen"); Eingabe_sperren = true; console.log("STEP 20: Daten werden gelöscht"); await loeschen(); console.log("STEP 30: Rezept wird gesucht"); await Rezeptsuche(); console.log("STEP 40: Stationsdaten werden gelesen"); await Daten_lesen(); console.log("STEP 50: Metadaten werden geschrieben"); await Meta_schreiben(); console.log("****************** update gesperrt: " + Eingabe_sperren); } catch (e) { console.error("Fehler in neueNummer: " + e); } finally { // Egal was passiert, Eingabe wieder freigeben Eingabe_sperren = false; } }
Kann der sendto async/await oder wie würde man da vorgehen.
Nein, aber du kannst dir nen async wrapper dafür schreiben:
function sendToAsync(instance, command, arg) { return new Promise((resolve, reject) => { sendTo(instance, command, arg, (result) => { if (result.error) { reject(result.error); } else { resolve(result.result); } }); }); }
und diesen dann mit await aufrufen:
const result = await sendToAsync('sql.1', 'query', sql_string); Data = result[0]; // ... wie bisher
-
@alcalzone
Na das schaue ich mir mal an und versuche es umzusetzen mit dem Wrapper.
ich denke, ich werde mich dazu noch mal melden -
@AlCalzone
zunächst vielen Dank, das funktioniert soweit und ich komme da einigemaßen mit klar.
Wo ich dich gerade an der Strippe habe, ich hätte da noch ein paar Fragen.- Fürs Daten senden an den SQL mittels insert oder Update, gibt es da auch eine Rückantwort, dass ich sicher sein kann, dass die Daten geschrieben worden sind?
Ein etwas anders Problem, ich habe noch per USB einen RFID Reader angeschlossen am Pi, dort wollte ich auf die Karten reagieren, das klappt auch soweit, es musste halt noch das NPM Modul "nfc-pcsc" installiert werden.
nun ist es leider so, dass bei einem Neustart des Scripts anscheinen jeweils ein neuer "Stream", oder wie man es nennt, mit aufgebaut wird und die Daten jeweils n mal geschrieben werden. Erst wenn ich den Javascript Instanz neustarte, werden die Daten auch nur ein mal geschrieben, bis ich das Script entweder neustarte oder es neu speichere.
Gibt es dafür vielleicht eine Lösung?Hier mal der Code und der Link zum NPM Modul
https://www.npmjs.com/package/nfc-pcscGruß und Vielen Dank für deine Unterstützung.
-
@ple sagte in async, await mit selector oder schleife????:
Gibt es dafür vielleicht eine Lösung?
Wenn du uns deinen bisherigen Code verheimlichst, eher nicht
-
@alcalzone
Man, da bin ich mal wieder sparsam mit InformationenCode für den RFID Leser wäre folgender.
// in ES6 //import { NFC } from 'nfc-pcsc'; // without Babel in ES2015 var { NFC } = require('nfc-pcsc'); var nfc = new NFC(); // optionally you can pass logger nfc.on('reader', reader => { console.log(`${reader.reader.name} device attached`); // enable when you want to auto-process ISO 14443-4 tags (standard=TAG_ISO_14443_4) // when an ISO 14443-4 is detected, SELECT FILE command with the AID is issued // the response is available as card.data in the card event // see examples/basic.js line 17 for more info // reader.aid = 'F222222222'; reader.on('card', card => { // card is object containing following data // [always] String type: TAG_ISO_14443_3 (standard nfc tags like MIFARE) or TAG_ISO_14443_4 (Android HCE and others) // [always] String standard: same as type // [only TAG_ISO_14443_3] String uid: tag uid // [only TAG_ISO_14443_4] Buffer data: raw data from select APDU response console.log(`${reader.reader.name} card detected`, card); console.log(card.uid) }); reader.on('card.off', card => { console.log(`${reader.reader.name} card removed`, card); reader.disconnect() }); reader.on('error', err => { console.log(`${reader.reader.name} an error occurred`, err); }); reader.on('end', () => { console.log(`${reader.reader.name} device removed`); reader.disconnect() }); }); nfc.on('error', err => { console.log('an error occurred', err); });
Und für Daten Schreiben auf dem SQL.
async function Meta_schreiben() { var SpeicherZeit = timeCon() setState("javascript.0.Ablauf.Timestamp", SpeicherZeit) var Rezept_Nr = getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val var Tabelle var DB = "Anlagen_Produktdaten"; if (Rezept_Nr <= 5) { Tabelle = "2590C" } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 6) { Tabelle = "2590M" } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 7) { Tabelle = "2590E" } let ssql = "INSERT INTO [" + DB + "].[dbo].[" + Tabelle + "]\ ([Timestamp]\ ,[Jahr_Nr]\ ,[Tag_Nr]\ ,[Id_Nr]\ ,[Typ_Name]\ ,[Typ_Nr]\ ,[Bediener]\ ,[DMC]\ ,[DMC_Kz_Motor]\ ,[DMC_Kz_Hauptgruppe_Bauteil]\ ,[DMC_Kz_Teile_Typ]\ ,[DMC_Kz_Untergruppe_Bauteil]\ ,[DMC_Q_Status]\ ) VALUES ( \ '" + SpeicherZeit + "' \ ,'" + getState("javascript.0.DMC_Kamera.Jahr_Nr").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Tag_Nr").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Id_Nr").val + "' \ ,'" + getState("javascript.0.Rezepte.Rezept_DS_Name").val + "' \ ,'" + getState("javascript.0.Rezepte.Rezept_DS_Nr").val + "' \ ,'" + getState("javascript.1.RFID_Name").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.DMC").val.slice(0, 36) + "' \ ,'" + getState("javascript.0.DMC_Kamera.Kz_Motor").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Kz_Hauptgruppe_Bauteil").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Kz_Teile_Typ").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Kz_Untergruppe_Bauteil").val + "' \ ,'" + getState("javascript.0.DMC_Kamera.Qstatus").val + "' \ )"; // SQL Daten schreiben sendTo('sql.1', 'query', ssql); console.log(ssql) console.log("Metadaten wurde geschrieben") }
-
@ple Na das ist doch schon besser. Allerdings verstehe ich noch nicht, was ganz spezifisch dein Problem ist.
Vielleicht zeigst du das noch an einem Beispiel, z.B. mit logs oder so? Der Code sieht auf den ersten Blick nicht falsch aus. -
@alcalzone
hier mal ein Beispiel, Javascript instanz neugestartet und RFID eingelesen, wurde auch nur 1 mal gelesen, so wie es auch sollte.
Danach das Script ein paar mal neu gestartet, danach kommt der Inhalt mehrmals, halt so oft wie das Script neu gestartet wurde. Denke der öffnet jeweils eine neue Verbindung zum Reader und somit kommt es öfters.11:06:01.417 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card detected 11:06:01.418 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: 74c3fe38 11:06:01.720 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:07.946 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:07.949 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:07.968 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:07.991 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:07.993 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:08.155 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.156 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.168 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:08.182 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:08.184 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:08.365 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.367 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.380 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:08.395 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:08.396 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:08.581 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.582 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.598 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:08.613 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:08.615 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:08.765 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.767 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.779 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:08.793 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:08.795 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:08.911 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.916 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:08.934 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:08.957 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:08.959 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:09.273 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:09.274 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:09.288 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:09.303 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:09.305 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:10.450 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.452 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.469 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:10.481 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:10.483 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:10.617 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.618 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.635 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:10.648 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:10.650 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:10.785 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.786 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.799 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:10.811 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:10.813 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:10.912 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.915 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:10.949 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:10.970 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:10.972 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.028 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.030 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.048 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.066 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.068 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.161 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.163 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.185 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.202 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.204 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.329 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.329 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.346 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.363 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.364 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.445 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.449 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.465 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.484 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.485 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.569 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.570 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.589 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.614 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.616 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.769 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.768 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.781 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.796 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.798 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:11.937 info javascript.0 (31556) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.938 info javascript.1 (24248) Stop script script.js.Benutzer.Test_Cardreader 11:06:11.962 info javascript.1 (24248) Start javascript script.js.Benutzer.Test_Cardreader 11:06:11.973 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: registered 0 subscriptions and 0 schedules 11:06:11.975 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 device attached 11:06:14.533 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card detected 11:06:14.534 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: 74c3fe38 11:06:14.560 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card detected 11:06:14.561 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: 74c3fe38 11:06:14.581 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card detected 11:06:14.581 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: 74c3fe38 11:06:14.605 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card detected 11:06:14.605 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: 74c3fe38 11:06:14.663 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:14.765 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:14.868 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:14.971 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.074 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.178 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.179 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.179 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.180 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.180 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.181 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.181 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.181 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.182 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.182 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.182 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.183 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.183 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.186 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.187 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.188 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.189 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.192 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.193 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.193 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.194 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.195 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.195 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.280 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.280 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.383 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.384 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed 11:06:15.486 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 an error occurred 11:06:15.487 info javascript.1 (24248) script.js.Benutzer.Test_Cardreader: ACS ACR122U PICC Interface 00 00 card removed
-
@ple Ich vermute, da müsste mindestens mal beim Skriptende die Verbindung geschlossen werden:
onStop(() => { nfc.close(); });
-
@alcalzone sagte in async, await mit selector oder schleife????:
@ple Ich vermute, da müsste mindestens mal beim Skriptende die Verbindung geschlossen werden:
onStop(() => { nfc.close(); });
So, habs mal ein paar Wochen immer mal wieder probiert, klappt nicht wie gehofft, egal.
nun habe ich ein größeres Problem, anscheinend habe ich immer noch nicht gecheckt wie man am besten eine Schrittkette aufbaut, wenn in der Schrittkette eine weitere Schrittkette aufgerufen werden soll, so das der Code komplett asyncron aufgerufen wird. Ich muss echt noch viel lernen.
Also das was ich erreichen möchte ist folgendes.In Main werden einzelne Funktionen aufgerufen // alles asyncron // alte Daten löschen await loeschen() // eine Rezeptsuche await Rezeptsuche() // Mehrere SQL Tabelle Daten abholen await Daten_lesen() // Danach Metadaten schreiben auf dem SQL await Meta_schreiben()
So, nun ist es so, dass ich in Daten_lesen() mehrere SQL Querys absetze und ich darauf warten möchte. Es kann mal sein, das keine Daten zurückkommen, z.B. wenn die Netzwerkverbindung abschmiert.
Also mehrere Funktionen verschachtelt, die asyncron ablaufen sollen, und genau da hänge ich.Oft bekomme ich folgende Fehler, weil ich irgendwo asyncron abarbeite aber keine Fehlerbehandlung gemacht habe.
2022-06-21 08:12:29.120 - error: javascript.0 (19020) Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 2022-06-21 08:12:29.121 - error: javascript.0 (19020) unhandled promise rejection: undefined 2022-06-21 08:12:29.122 - error: javascript.0 (19020) undefined
Würdest du mir da vielleicht noch ein paar Dinge erklären, wie man es am einfachsten macht, damit ich das verstehe? Denke das werde ich in Zukunft öfter gebrauchen müssen.
Anbei mal der vereinfachte Code.
var Meldungen var DMC /************************* Main ******************************* */ async function main() { try { setState(Meldungen, "Alte Daten werden gelöscht") await loeschen() await setStateAsync(Trigger_neue_Nummer, false); setState(Meldungen, "Rezept wird gesucht") await Rezeptsuche() setState(Meldungen, "Daten werden gelesen") await Daten_lesen() await Meta_schreiben() } catch (e) { setState(Meldungen, ("Fehler in Main: " + e)) console.error("Fehler in Main: " + e); } finally { } } /************************* alte Daten löschen ******************************* */ async function loeschen() { await $('state[state.id=javascript.0.Daten_senden.A_654_Endkontrolle.*]').setStateAsync(false) await $('state[state.id=javascript.0.Daten_lesen.A_654_Endkontrolle.*]').setStateAsync(false) console.log("************ Daten gelöscht") } //############################################## Rezept suchen ############################################## async function Rezeptsuche() { var DS_Nr = 0 var DS_gefunden = false var Suche_beendet = false var treffer = false for (i = 1; i <= 20; i++) { var i = "000" + i; i = i.substring(i.length - 2, i.length); treffer = true DS_gefunden = true if (!getState('javascript.0.Rezepte.' + i + '.Rezept_aktiv').val) { treffer = false; DS_gefunden = false; } else { for (a = 1; a <= 36; a++) { var a = "000" + a; a = a.substring(a.length - 2, a.length); if (getState('javascript.0.Rezepte.' + i + '.DMC_aktiv_' + a).val) { if (!(getState('javascript.0.Rezepte.' + i + '.DMC_Wert_' + a).val == (DMC.slice(a - 1, a)))) { treffer = false DS_gefunden = false } } } } if (treffer) { DS_Nr = i DS_gefunden = true await setStateAsync('javascript.0.Rezepte.Rezept_DS_gefunden', true) console.log("***** Rezept gefunden") break; } else { } } await setStateAsync("javascript.0.Rezepte.Rezept_DS_Nr", DS_Nr) //console.log("Rezept gefunden: " + getState("javascript.0.Rezepte.Rezept_DS_Nr").val) //console.log("*************** Rezept gefunden") } //############################################## Daten Lesen Main ############################################## async function Daten_lesen() { if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val <= 5) { await Daten_lesen_SQL('0265') await Daten_lesen_SQL('U_654') await Daten_lesen_SQL('U_655') await Daten_lesen_SQL('A_656') } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 6) { await Daten_lesen_SQL('0290') await Daten_lesen_SQL('A_656') } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 7) { await Daten_lesen_SQL('0290') await Daten_lesen_SQL('A_656') } } //############################################## Daten Lesen der einzelnen Tabellen ############################################## async function Daten_lesen_SQL(Tabelle) { var Data; var i; var Spaltenname; var Data_Column = {}; var DB = "Testdaten"; var sql_string switch (Tabelle) { case '2590C': sql_string = "USE " + DB + " SELECT TOP (1) * \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case '2590M': sql_string = "USE " + DB + " SELECT TOP (1) * \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case '2590E': sql_string = "USE " + DB + " SELECT TOP (1) * \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case '0265': sql_string = "USE " + DB + " SELECT TOP (1) Timestamp, Jahr_Nr, Tag_Nr, Id_Nr \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case '0290': sql_string = "USE " + DB + " SELECT TOP (1) Timestamp, Jahr_Nr, Tag_Nr, Id_Nr \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case '0650': sql_string = "USE " + DB + " SELECT TOP (1) Timestamp, Jahr_Nr, Tag_Nr, Id_Nr \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ ORDER BY id DESC" break; case 'U_654': sql_string = "USE " + DB + " SELECT TOP (1) Timestamp, AnlagenNr \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ " break; case 'U_655': sql_string = "USE " + DB + " SELECT TOP (1) Timestamp, Anlagen_Nr \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ " break; case 'A_656': sql_string = "USE " + DB + " SELECT TOP (1) * \ FROM dbo.[" + Tabelle + "] \ WHERE (Jahr_Nr = " + DMC_Jahr_Nr + ") AND (Tag_Nr = " + DMC_Tag_Nr + ") AND (ID_Nr = " + DMC_Id_Nr + ") \ " break; default: break; } setState(Meldungen, "Lese Daten von Tabelle: " + Tabelle); console.log("Lese Daten von Tabelle: " + Tabelle) const result = await sendToAsync('sql.1', 'query', sql_string); Data = (result[0]); for (Spaltenname in Data) { let x = Data[Spaltenname]; let Daten = JSON.stringify(x); if (typeof Data === 'undefined') { //log(Tabelle + " keine Daten vorhanden"); } if (typeof Data !== 'undefined') { // States anlegen if (await existsStateAsync('javascript.0.Daten_lesen.' + Tabelle + '.' + Spaltenname)) { //log(Spaltenname + " " + Daten) if (Spaltenname == "Timestamp") { Daten = Daten.replace('Z', ''); } Daten = Daten.replace('"', ''); Daten = Daten.replace('"', ''); await setStateAsync('Daten_lesen.' + Tabelle + '.' + Spaltenname, Daten); } else { // Daten lesen Datenpunkte werden erzeugt await createStateAsync('javascript.0.Daten_lesen.' + Tabelle + '.' + Spaltenname, '', { name: Spaltenname, type: 'mixed', role: 'state' }); await setStateAsync('Daten_lesen.' + Tabelle + '.' + Spaltenname, Daten); log("State wurde erstellt " + 'javascript.0.Daten_lesen.' + Tabelle + '.' + Spaltenname) // Daten senden Datenpunkte werden erzeugt await createStateAsync('javascript.0.Daten_senden.' + Tabelle + '.' + Spaltenname, '', { name: Spaltenname, type: 'mixed', role: 'state' }); await setStateAsync('javascript.0.Daten_senden.' + Tabelle + '.' + Spaltenname, Daten); log("State wurde erstellt " + 'javascript.0.Daten_senden.' + Tabelle + '.' + Spaltenname) } } } } /******************************* Metadaten schreiben *********************** */ async function Meta_schreiben() { await timeCon() var Rezept_Nr = getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val var Tabelle var DB = "Test"; if (Rezept_Nr <= 5) { Tabelle = "A_656" } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 6) { Tabelle = "A_656" } else if (getState('javascript.0.Rezepte.Rezept_DS_Nr'/*Rezept DS Nr*/).val = 7) { Tabelle = "A_656" } let ssql = "INSERT INTO [" + DB + "].[dbo].[" + Tabelle + "]\ ([Timestamp]\ ,[Typ_Nr]\ ) VALUES ( \ '" + getState('javascript.0.Ablauf.Timestamp').val + "' \ ,'" + getState("javascript.0.Rezepte.Rezept_DS_Nr").val + "' \ )"; sendTo('sql.1', 'query', ssql); console.log("******** Metadaten wurde geschrieben") } /******************************* Timestamp für MS SQL zusammenstellen *********************** */ async function timeCon() { var a = new Date(Date.now()); var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var year = a.getFullYear(); var month = months[a.getMonth()]; var date = a.getDate(); var hour = a.getHours(); var min = a.getMinutes(); var sec = a.getSeconds(); var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec; await setStateAsync('javascript.0.Ablauf.Timestamp', time) } /******************************** String to boolean ***************** */ function STB(Wert) { switch (Wert.toLowerCase().trim()) { case "true": case "yes": case "1": return true; case "false": case "no": case "0": case null: case "null": return false; //default: return Boolean(Wert); default: return Wert; } } /******************************** Bit to integar ***************** */ function BTI(Wert) { var Ergebnis if (Wert) { Ergebnis = 1 } else { Ergebnis = 0 } return Ergebnis } /********************************SQL Sendto Wrapper ***************** */ function sendToAsync(instance, command, arg) { return new Promise((resolve, reject) => { sendTo(instance, command, arg, (result) => { if (result.error) { reject(result.error); } else { resolve(result.result); } }); }); }
-
In Zeile 1-10 rufst du await functionen auf ohne Try/catch dadurch Schmiert dein Script gerade ab.
-
@dutchman
Besten dank schon mal im voraus für deine Hilfe.
Um das für mich zu verstehen, was für andere wahrscheinlich selbstverständlich ist, benötigt man immer ein try and catch in jeder await funktion die ich so aufrufe? Würde dann beim einem Fehler in einer await funktion das catch greifen und damit würde das main trotzdem weitergehen?also so dann ungefähr?
async function main() { try { setState(Meldungen, "Alte Daten werden gelöscht") await loeschen() await setStateAsync(Trigger_neue_Nummer, false); setState(Meldungen, "Rezept wird gesucht") await Rezeptsuche() setState(Meldungen, "Daten werden gelesen") await Daten_lesen() await Meta_schreiben() } catch (e) { setState(Meldungen, ("Fehler in Main: " + e)) console.error("Fehler in Main: " + e); } finally { } } /************************* alte Daten löschen ******************************* */ async function loeschen() { try { await $('state[state.id=javascript.0.Daten_senden.A_654_Endkontrolle.*]').setStateAsync(false) await $('state[state.id=javascript.0.Daten_lesen.A_654_Endkontrolle.*]').setStateAsync(false) console.log("************ Daten gelöscht") } catch (e) { console.error("Fehler beim löschen: " + e) } }
Hat einer vielleicht noch ne guten Tip für Schulungen zu Javascript, oder bietet vielleicht einer sowas auch an?
Gruß und Danke
-
@ple sagte in async, await mit selector oder schleife????:
Um das für mich zu verstehen, was für andere wahrscheinlich selbstverständlich ist, benötigt man immer ein try and catch in jeder await funktion die ich so aufrufe?
korrekt sollte man so machen, den die Meldung
Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
kommt von der await function und das die promise (siehe erklaehrung @AlCalzone) ein throw error macht dieser error aber nicht abgefangen wird.
Mit try catch kannst du dies fehler dan im catch abfangen und Aktionen auslösen.
Kann mir z.b. vorstellen wenn einer der schritte schiefgeht, die anderen auch nicht stattfinden sollten?@ple sagte in async, await mit selector oder schleife????:
Würde dann beim einem Fehler in einer await funktion das catch greifen und damit würde das main trotzdem weitergehen?
richtig verstanden, beachte hierbei aber ob der code weiter laufen darf wenn die function einen Fehler abgegeben hat, Beispiel :
Ich habe einige adapter die frage eine API ab, z.b. alle 10 min. Schlägt der API Aufruf fehl stoppt mein code (ohne Daten kann ich ja auch nichts verarbeiten)
@ple sagte in async, await mit selector oder schleife????:
also so dann ungefähr?
mja fast, denn jetzt hast du einen try um alle await, also geht einer schief stop der code im catch (wenn das so gewünscht ist alles gut !) Wen man separate die Rückgabe auswerten moechte sollte ein try/catch for jedem await anstatt in einem Block
@ple sagte in async, await mit selector oder schleife????:
Hat einer vielleicht noch ne guten Tip für Schulungen zu Javascript, oder bietet vielleicht einer sowas auch an?
Wir selber nicht wirklich, sind aber gerne bereit fragen zu beantworten und unnterstuetzen sowohl hier als auch im Discord wo wir eine live chat haben.
Allgemein aka ich die Kurse von Udemy sehr empfehlen, die kosten im Angebot oft nur 10-15 euro.Ich kann z.b. "JavaScript: Understanding the Weird Parts" sehr empfehlen, ist ein eye opener wen man aus anderen programmier sprachen kommt, de gibt es glaube ich auch in Deutsch.
Bei fragen einfach melden, oder eventuell discord joinen dan kan man auch bissl live unterstützen
-
@dutchman
Sorry, die Kids haben mich ein wenig in Anspruch genommen, aber ne kleine Pause ist auch mal nicht schlecht um das geschriebene neu zu lesen
Ok, grundsätzlich alles was await ist abfangen mit try und catch.
Müsste man es auch bei einemawait setStateAsync('Daten_lesen.' + Tabelle + '.' + Spaltenname, Daten);
oder ist es in der function setStateAsync bereits mit eingebaut oder geht man davon aus, dass es garantiert beschrieben werden kann.
Zum Thema abbrechen und eine Fehlermeldung ausspucken.
Kann ich meine function Main irgendwie abbrechen, wenn ein error bei irgendein await auftritt? z.B, das die Metadaten nicht geschrieben werden können, weil der SQL nicht erreichbar ist? Dann sollte der Rest auch nicht mehr laufen.Und nochmals herzlichen Dank für eure Unterstützung
Einige Bücher werde ich mir mal zulegen bei Zeiten.
Gruß -
@ple sagte in async, await mit selector oder schleife????:
geht man davon aus, dass es garantiert beschrieben werden kann.
Nein, musst du selbst abfangen.
Kann ich meine function Main irgendwie abbrechen, wenn ein error bei irgendein await auftritt? z.B, das die Metadaten nicht geschrieben werden können, weil der SQL nicht erreichbar ist? Dann sollte der Rest auch nicht mehr laufen.
Ja, try-catch um jedes setStateAsync und im catch die Funktion mit
return
verlassen. (Wäre die Variante wo du am meisten Kontrolle hast).
Ansonsten kannst du auch den ganzen Schreibprozess in ein try-catch packen. Dann wird automatisch ins catch gesprungen, sobald ein Versuch fehlschlägt.