2016-06-02 3 views
0

Я использую модуль NPM 'binary-parser' в node.js и пытаюсь использовать свою собственную функцию assert, вместо того, чтобы поставлять ее inline. Я не знаю, является ли проблема проблемой «двоичного-парсера», или это связано с моим незнанием вызовов функций и/или ссылок функций в javascript.javascript using non-inline function

Вот код, который работает, но не то, что я хочу:

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)); 

Я хотел бы назвать своим собственным «Диапазон» функции, как это:

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

Но я получаю:

ReferenceError: x is not defined 

Так что я пробовал:

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

и

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

и получите:

ReferenceError: range is not defined 

Можно ли делать то, что я хочу?

+1

Может быть, Http://stackoverflow.com/questions/12930272/javascript-closures-vs-anonymous-func является интересным и полезным читать? – Dilettant

+1

Спасибо, и я нашел, что это еще более полезно (по крайней мере для меня): http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – kevdev

ответ

2

Вы хотите использовать замыкание:

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

С, что вы можете написать

… 
.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

Возврат «мин не определен». Он распознает «min» и «max» вне «function (x)», но не внутри него. Я попробовал: 'function range (someMin, someMax) { var min = someMin; var max = someMax; Функция возврата (x) { \t return min <= x && x <= max; }; } ' , и он все еще не распознал функцию« min »внутри (x). – kevdev

+1

О, моя, какая ужасная библиотека. Он [строит функцию] (https://github.com/keichi/binary-parser/blob/master/lib/binary_parser.js#L316), что делает невозможным закрытие. Вы должны указать ошибку. – Bergi

+1

@ kevdev: как обходной путь, 'диапазон функций (мин, макс) {return new Function (" x "," return "+ JSON.stringify (min) +" <= x && x <= "+ JSON.stringify (макс) + ";"); } 'должен сделать это. – Bergi

0

Пробовали ли вы:

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

НТН

+0

Он все еще возвращается 'диапазон не определен ». – kevdev