2016-06-02 19 views
0

Ich bin mit dem 'binary-Parser' NPM-Modul in node.js und versuche, meine eigene "Assert" -Funktion zu verwenden, anstatt es inline zu liefern. Ich weiß nicht, ob das Problem der des 'binären Parsers' ist oder ob ich nicht weiß, Funktionen und/oder Funktionsreferenzen in Javascript zu nennen.Javascript mit Nicht-Inline-Funktion

Hier ist der Code, das funktioniert aber nicht, was ich will:

var Parser = require('binary-parser').Parser; 

var data = new Buffer([0x23, 0x36, 0x74, 0x0e, 0x01, 0xff, 0xff]); 

function range (min, val, max) { 
    return (min <= val && val <= max); 
} 
var dataParser = new Parser() 
.endianess('little') 
.uint8('inside_humidity', {assert: function(x){return(x <= 100);}}) 
.uint16('barometer', {assert: function(x){return(20000 <= x && x <= 32500);}, 
    formatter: function(x) {return x/1000;}}) 
.uint16('wind_direction', {assert: function(x){return(x <= 360);}}) 
.uint16('crc'); 

console.log(dataParser.parse(data)); 

Ich mag würde meine eigene ‚Reichweite‘ Funktion wie folgt nennen:

.uint16('barometer', 
     {assert: range(20000, x, 32500), 
    formatter: function(x) {return x/1000;}}) 

aber ich bekomme:

ReferenceError: x is not defined 

Also habe ich versucht:

assert: function(x){range(20000, x, 325000)} 

und

{assert: function(x){range.bind(this, 20000, x, 32500)}, 

und erhalten:

ReferenceError: range is not defined 

Ist es möglich, zu tun, was ich will?

+1

Vielleicht http schreiben://stackoverflow.com/questions/12930272/javascript-closures-vs-anonymous- Funktionen ist eine interessante und hilfreiche Lektüre? – Dilettant

+1

Vielen Dank und ich fand, dass dies noch hilfreicher (zumindest für mich): http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – kevdev

Antwort

2

Sie wollen einen Verschluss verwenden:

function range(min, max) { 
    return function(x) { 
     return min <= val && val <= max; 
    }; 
} 

Damit Sie

… 
.uint8('inside_humidity', {assert: range(-Infinity, 100)}) 
.uint16('barometer', {assert: range(20000, 32500), formatter: function(x) {return x/1000;}}) 
.uint16('wind_direction', {assert: range(-Infinity, 360)}) 
… 
+0

Das kommt zurück 'min ist nicht definiert'. Es erkennt 'min' und 'max' außerhalb von 'function (x)', aber nicht innerhalb davon. Ich habe versucht: 'Funktionsbereich (etwasMin, etwasMax) { var min = etwasMin; var max = irgendeinMax; Rücksprungfunktion (x) { \t zurück min <= x && x <= max; }; } ' und es erkannte immer noch 'min' innerhalb Funktion (x). – kevdev

+1

Oh mein Gott, was für eine schreckliche Bibliothek. Es [stringt die Funktion] (https://github.com/keichi/binary-parser/blob/master/lib/binary_parser.js#L316), was Schließungen unmöglich macht. Sie sollten einen Fehler einreichen. – Bergi

+1

@kevdev: Als Workaround: 'Funktionsbereich (min, max) {return new Funktion (" x "," return "+ JSON.stringify (min) +" <= x && x <= "+ JSON.stringify (max) + ";"); } 'sollte es tun. – Bergi

0

Haben Sie versucht:

.uint16('barometer', {assert: function(x){return range(20000, x, 32500);}, 

HTH

+0

Es kommt immer noch zurück 'Bereich ist nicht definiert ". – kevdev