NEWS
warten auf exec befehl [resolved]
-
Hallo,
ich möchte gerne ein exec in eine Funktion packen, welche aber erst zurück kommen soll, wenn der exec fertig ist. Ich könnte natürlich alle weiteren Befehle hinter "// weitere Befehle" schreiben, finde dies aber eher unübersichtlich. Gibt es andere elegante Möglichkeiten (mit promise, async, await etc)?function some_exec() { exec("sleep 5", function (error, stdout, stderr) { log("exec ist fertig"); // weitere Befehle }); } some_exec(); log("exec ist sofort zurück");
-
function some_execAsync() { return new Promise((resolve, reject) => { exec("sleep 5", function (error, stdout, stderr) { log("1 exec ist fertig"); resolve(); }); }) } async function main() { await some_execAsync(); log("2 exec ist fertig"); } main()
-
@fastfoot Danke
-
Nabend!
Das Thema ist schon etwas älter, aber passt so ziemlich genau auf meinen Anwendungsfall. Ich möchte mir per Telegram Bilder von der Cam zuschicken.
Folgendes Script liegt zu Grunde:const idTestTrigger = "0_userdata.0.Fenster1"; async function fotoMachen() { return new Promise ((resolve) => { exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/"); exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg http://10.146.26.135:8765/picture/1/current/"); resolve(); }); } async function fotoSenden() { await fotoMachen(); sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Garten.jpg`); sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg`); } on({id: idTestTrigger, change: "any"}, async function () { await fotoSenden(); })
Es funktioniert trotz promise, trotz await und sonst was leider nicht. Die Lösung mit einem Timeout vor dem sendTo kenne ich, sie funktioniert auch. Nur wollte ich es etwas eleganter machen. Leider habe ich wohl einen Nagel im Kopf. Hat jemand ne Idee
Log:
elegram.0 2023-06-15 20:22:02.837 error Cannot send photo [chatId - 1271149145]: Error: ETELEGRAM: 400 Bad Request: file must be non-empty
LG Karel
-
Hatte erst was mit callbacks geschrieben aber geht auch komplizierter
Code hab ich bei fastfood geklaut
function some_execAsync() { return new Promise((resolve, reject) => { exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) { log("1 exec ist fertig"); resolve(); }); }) }
-
@ticaki
Oh man, so hatte ich es vorhin tatsächlich schon mal stehen. Anscheinend war irgendwo doch ein "Schreibfehler" oder so drin...
Trotzdem vielen Dank natürlich an Dich!!! -
@ticaki sagte in warten auf exec befehl [resolved]:
bei fastfood geklaut
das geht garnicht, ich schenk' ihn dir
hier noch eine Alternative:const util = require("util"); const execAsync = util.promisify(require("child_process").exec); const test = async (cmd) => { let erg = await execAsync(cmd); log('1 ' + erg.stdout) log('2 ' + erg.stderr) } test('ls')
-
@fastfoot
den will ich auch geschenkt haben -
@ticaki sagte in warten auf exec befehl [resolved]:
@fastfoot
den will ich auch geschenkt habennur zu
wichtiger als diese Schnipsel ist aber die Tatsache dass man mit beiden Methoden fast alles was einen callback nutzt in ein Promise wandeln kann, auf welches man dann ganz bequem mit await warten kann. Gut für ältere Tools welche callbacks verwenden, neuere bieten ja fast immer auch eine Version mit Promise an. Auch wichtig, eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet
-
@ticaki sagte in warten auf exec befehl [resolved]:
erst was mit callbacks geschrieben aber geht auch komplizierter
Naja, ich finde callbacks eher kompliziert zum Lesen.
@fastfoot sagte in warten auf exec befehl [resolved]:
eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet
Blockly bildet ja eigentlich immer async ab, ob await vorkommt, oder nicht. Ist ja auch nicht schädlich, oder?
-
@karel-puhli in JS schadet es der Lesbarkeit bzw Verständlichkeit, ansonsten schadet es nicht. In Blockly vermute ich ist es der Einfachheit wegen, async davor und passt immer