javascript: array of functions - parameter?

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/javascript-array-of-functions-parameter_247821/page_1 - zur Vollversion wechseln!


wergor schrieb am 15.12.2016 um 14:16

ich parse eine .ini file mit kommandos darin und erstelle ein array von funktionen. manche der kommandos haben zusätzlich einen parameter, z.b.:

Code: INI
[Commands]
command_0 = Wait(500)
die kommandos werden in ein array aus funktionen übersetzt:
Code: JS
if (command.match(/^Wait\((.*)\)$/))        //matches Wait(xxx)
    sequence.commands.push(function() {
        var time = command.match(/^Wait\((.*)\)$/)[1];
        return sleep(time + "ms");
    });
das beispiel oben funktioniert wie gewünscht. das beispiel unten nicht: hier ist zur laufzeit die variable "command" (die mit RegEx ausgewertet wird) undefined.
Code: JS
if (command.match(/^PowerOn(\((.*)\))?$/))        //matches ^PowerOn$ and ^PowerOn(xxx)$
    sequence.commands.push(function() {
        if (command.match(/^PowerOn(\((.*)\))?$/)[2]) {    //sets voltage if voltage has been given
            var voltage = command.match(/^PowerOn\((.*)\)$/)[2] * 10e3;        //convert from V to mV
            setParameter("Voltage", voltage);
        }
        return setContact("VCC", true);
    });

ich finde den fehler nicht, hat jemand von euch eine idee, oder einen vorschlag wie man das besser lösen kann?


JC schrieb am 15.12.2016 um 18:41

Warum escapst du die Klammern nicht?

command.match(/^PowerOn(?:\((\w+)\))?$/)

Zum Testen würde ich persönlich

Code: JS
/regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf
Code: JS
var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen.


ill schrieb am 15.12.2016 um 18:42

Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?


wergor schrieb am 16.12.2016 um 21:26

Zitat von JC
Warum escapst du die Klammern nicht?

command.match(/^PowerOn(?:\((\w+)\))?$/)

Zum Testen würde ich persönlich
Code: JS
/regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf
Code: JS
var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen.
die klammern sind optional. falls sie existieren muss ich den wert darin übernehmen.

Zitat von ill
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
der code oben ist im selben scope (ist eine liste von else if (command.match(x)) {} ), wird aber in einem anderen scope ausgeführt, wo command nicht existiert. ich habe es zuerst mit Wait versucht, und weil das funktioniert hat bin ich davon ausgegangen dass entweder die regex zum zeitpunkt des erstellens ausgewertet wird (und in der funktion dann command nicht mehr benötigt wird) oder command im scope behalten wird. offenbar ist aber beides nicht der fall, deshalb frage ich mich warum das beispiel mit Wait funktioniert :confused:


JC schrieb am 16.12.2016 um 21:45

Zitat von wergor
Zitat von ill
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
Die Klammern bilden doch immer eine Capturing Group, außer du escapst sie.

Dein Beispiel mit Wait erzeugt zwei Capturing Groups, wobei beide immer den gleichen Inhalt besitzen. Zudem ist in deiner Gruppe immer die Klammer inkludiert, also in deinem Beispiel "(500)". Dein Beispiel funktioniert nur wegen dem Dot-Star und würde etwa auch "Waitfoobar" oder "Wait for me, darling!" matchen.


wergor schrieb am 19.12.2016 um 11:53

jetzt verstehe ich was du meinst. die klammern werden schon escaped, aber die forensoftware hat die "\" beim posten offenbar gelöscht. die klammern sind optional, falls sie existieren enthält die erste capturing group "(value)" und die zweite "value", deshalb arbeite ich in den skripts nur mit capturing group 2 (ausnahme: "Wait" hat immer die klammern, deshalb ist die regex in den fall etwas anders)
was in den klammern tatsächlich drin steht ist für mich nicht so wichtig - wenn keine zahl übergeben wird wirft das framework beim aufruf der funktion einen fehler und herr dipl.ing. user muss seine .ini files fixen ;)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026