NEWS
Syncrone exec Funktion?
-
Hallo,
ich beschäftige mich seit ein paar Stunden mit einem Problem was ich so nicht gelöst bekomme. Im Forum habe ich einige Ansätze gefunden, aber keine funktioniert so wie ich es gerne hätte.
Ich habe ein Array, mit ein paar Ping-Zielen (als Beispiel), die aber nicht gleichzeitig starten sollen, sondern nacheinander. Also wenn der Ping 1 fertig ist, soll der 2te Starten. Alle Versuche laufen paralell ab, was ich aber so nicht gebrauchen kann. Gibt es eine möglichkeit auf das ende des exec zu warten um dann das nächste zu starten?
Mein Code sieht derzeit so aus:
let pingArray = [ "localhost", "google.de", "debian.org" ]; pingArray.forEach(function(value) { console.log('Test-Ping to ' + value + ' startet...'); // Hier soll abgewartet werden, bis der "Job" abgearbeitet wurde, bevor das nächste Element abgearbeitet wird. exec('ping -c 10 ' + value); console.log('Ping ' + value + ' done....'); });
-
@tomtaz sagte: Gibt es eine möglichkeit auf das ende des exec zu warten um dann das nächste zu starten?
Ja, durch Nutzung der Callback-Funktion von exec():
const pingArray = [ "localhost", "google.de", "debian.org" ]; var i = 0; function sendPing() { log('Test-Ping to ' + pingArray[i] + ' startet...'); exec('ping -c 10 ' + pingArray[i], function(error, stdout, stderr) { if(!error) log('Ping ' + pingArray[i] + ' done....'); i++; if(i < pingArray.length) sendPing(); }); } sendPing();
-
@tomtaz sagte in Syncrone exec Funktion?:
Gibt es eine möglichkeit auf das ende des exec zu warten um dann das nächste zu starten?
Klar, mit Promises:
let pingArray = [ "localhost", "google.de", "debian.org" ]; async function ping(hostnamme) { return new Promise((resolve) => { console.log(`Test-Ping to ${hostnamme} startet...`); exec(`ping -c 10 ${hostnamme}`, (error, stdout, stderr) => { resolve(stdout); }); }); } (async () => { for (let host of pingArray) { await ping(host); console.log(`Ping ${host} done....`); } })();