Функция в качестве параметра, JS

  1. 2 г. назад

    По сканерам, как я понимаю, глухо. Но да и бог с ними, со сканерами.
    У меня тут потеря потерь.
    Нагородил огород, теперь не могу понять, как раскрутить обратно.
    Итого: есть функция, отправляющая некий html

    function sendTextFileWithProcessing(filename, req, res, params = undefined){
    	fs.readFile(filename, 'utf8', function(error, data){
    		if(error){
    			res.sendFile(__dirname + '/404.htm');
    		}
    		else{
    			let htm = data.replace('<title>~</title>', '<title>' + global_title + '</title>');
    			htm = htm.replace('<div>Usertext</div>' , auth.logoff_text(req));
    			if(params != undefined){
    				let cnt = 0;
    				params.forEach(item_par => {
    					cnt++;
    					htm = htm.replace(item_par.par , item_par.val);
    					if(cnt == params.length){
    						res.send(htm);
    					}
    				});
    			}
    			else{
    				res.send(htm);
    			}
    		}
    	});	
    }

    Теперь я хочу в качестве params передать ей массив с единственным объектом, в котором будет замена тела странички-шаблона.

    function doc_page(doc_id, req, res){
    	let user = auth.find_user(req);
    	if(user == undefined){
    		res.sendFile(__dirname + '/static/htm/auth.htm');
    	}
    	else{
    		sendTextFileWithProcessing(__dirname + '/static/htm/doc.htm', req, res, [{par: '<div id="sc_show"></div>', val: function(db.tblDoc(doc_id)){
    			return 'hello';
    		}}]);
    	}
    }

    В ней я заполняю массив параметров:

    [{par: '<div id="sc_show"></div>', val: function(db.tblDoc(doc_id)){return 'hello';}}]

    И вот тут всё валится: мол, unexpected token.

    Если вызывать без параметра анонимной функции, то всё ок:

    [{par: '<div id="sc_show"></div>', val: function(){return 'hello';}}]

    Вот собственно, я и хочу понять: разве никак нельзя параметром функции передавать другую функцию?

    Ответы: (5) (6) (7)
  2. Даже, собственно, забудьте про первый пост.
    Вот допустим, есть две функции:

    function a(){ return 1; }

    И

    function b(par){ console.log(par); }

    Почему нельзя сделать

    b(a());

    ?

    Ответы: (2) (7)
  3. (1) наверно b(a) ? b(a()) вроде б можно сделать

    Ответы: (3)
  4. (2) не, так-то можно. Но если мне надо и в вызываемую функцию параметр? Например,

    function a(par){ return par; }

    ?

  5. function a(par){ return par; }
    function b(par){ console.log(par); }
    И что о мешает сделать b(a(1))?

    Ответы: (9)
  6. 20.10.2021 17:48:07 отредактировано sda553

    Дуб Вот собственно, я и хочу понять: разве никак нельзя параметром функции передавать другую функцию?

    Легко js постоянно этим занимается. Но объяаление функции какое то странное
    function a(par){ return par; } - это я понимаю
    function a(par){ return par; } (tblDoc(doc_id)) - это я тоже понимаю

    function(db.tblDoc(doc_id)){return 'hello';} - тут какая то херь в скобках, а должна быть объявлена переменная, как par

    Ответы: (9)
  7. Дуб function(db.tblDoc(doc_id)){return 'hello';}

    Тут ошибка. Нельзя так объявлять функцию. В имени параметров не может быть точек и скобок, а ты туда запихал db.tblDoc(doc_id). Это же не вызов функции, а ее объявление.

    Ответы: (8) (11)
  8. Дуб Почему нельзя сделать

    Так можно, потому что тут ты вызываешь уже существующую функцию с параметром. А в (0) ты создаешь функцию. Это разные вещи.

  9. (6) вот мне интерпретатор на это в сабже и намекает. Но как мне передать параметр, обращаясь к функции без () ?

    Ответы: (11)
  10. (4)

    sda553 function(db.tblDoc(doc_id)){return 'hello';} - тут какая то херь в скобках, а должна быть объявлена переменная, как par

    вот как её объявить? Где? Это же не let, это же var, так? А у меня код по разным модулям разнесён, которые я в основному подключаю через module.exports.* = *

  11. Собссна, проблема даже не в сабже, а в корректном вызове колбэка. Пока у меня всё в одном модуле было - вопросов не было. Как разнёс, начались (для меня) непонятки.
    В данном случае проблема в асинхронном чтении текстового файла функцией db.tblDoc(doc_id){} (ретурн тут для мебели, на самом деле там другой код, естественно).
    Если переделываю на синхронное чтение файла, то вопрос с колбэком отпадает.

  12. 21.10.2021 16:27:26 отредактировано webdev

    Дуб (6) вот мне интерпретатор на это в сабже и намекает. Но как мне передать параметр, обращаясь к функции без () ?

    Вот это объявление функции:

    const myFunc = function(param) {return 'hello';};

    а вот это вызов существующей функции с параметром:

    myFunc(db.tblDoc(doc_id));

    а вот это объявление функции и сразу же вызов ее с параметром:

    (function(param){return 'hello';})(db.tblDoc(doc_id))

    Чувствуешь разницу?

    в первых скобках после слова function просто имя параметра. А сам параметр передается во вторых скобках, в самом конце. Иначе как ты его будешь использовать внутри функции? Подумай.

    Ответы: (12) (13)
  13. (11) поставил бы плюсик да не могу
    Но годно

  14. (11) оставайтесь. Будете нашим гениальным механиком.
    Посыпаю голову пеплом и мои пределы не будут знать благодарности :)

или зарегистрируйтесь чтобы ответить!