Как я могу запустить все функции с их соответствующими аргументами сразу с помощью одного `run()`?

#javascript #node.js

#javascript #node.js

Вопрос:

Если у меня есть два файла,

Файл 1

 exports.run = () => {
    console.log(test.property, test2.property, etc.property)
};
exports.info = {
    name : "test"
}
  

Файл 2

 const fs = require('fs');
let test;
let test2;
let etc;
test.property = "test";
test2.property = "test2";
etc.property = "etc";
let functions = new Map();
fs.readdir('./', (err, files) => {
    if (err) console.error(err);
    files.forEach(f => {
        let props = require(`./${f}`);
        functions.set(props.info.name, props);
    });
});
functions.get("test").run()
  

Поскольку у меня это есть прямо сейчас, мне нужно вручную добавить каждую переменную в качестве параметра в файл 1, а в файле 2 мне нужно вручную передать каждую через .run() . Это утомительно и раздражает, так могу ли я в любом случае просто охватить .run() , чтобы он использовал все текущие переменные?

Комментарии:

1. Я пытаюсь понять ваш код, но не могу понять вашу цель. Может быть, сделать код короче и чище и объяснить вопрос по-другому?

2. У меня много функций, и мне нравится иметь несколько файлов, поскольку это проще и организованнее, и я помещаю все функции в карту, чтобы она не была такой запутанной, поскольку у меня много функций, но для каждой из них, когда я их вызываю, я должен передавать параметры. Было бы намного проще, если бы все эти функции могли быть просто ограничены, как функции, которые я определяю в основном коде, так есть ли способ сделать это?

3. Я пытаюсь понять ваш вариант использования здесь; итак, у вас есть несколько модулей, в каждом из которых есть некоторые функции, и вы пытаетесь передать значения из основного скрипта в каждый из этих модулей?

4. Область видимости — это просто контейнер переменных. Знаете, что еще является контейнером переменных? Объект! Просто поместите все, что вы хотите передать, параметры в объект и передайте этот один объект вашим функциям. Таким образом, вы можете свободно добавлять или удалять переменные без необходимости менять их в нескольких местах.

Ответ №1:

Я не уверен, тот ли это код, который вам нужен

 
const args = {
    foo: ["a", "b"],
    bar: ["c", "d", "e"]
}

const map = new Map();


function Foo(first, second) {
    console.log(first, second)
}

function Bar(first, second, third) {
    console.log(first, second, third)
}

map.set("foo", Foo);
map.set("bar", Bar);

function run() {
    for(const key of map.keys()) {
        const func = map.get(key);
        func.apply(undefined, args[key])
    }
}

run();

// output
// a b
// c d e
  

ключевым моментом является apply функция, которая может вызывать ссылку на функцию со своими аргументами в качестве apply аргументов. Вы можете подробнее ознакомиться с MDN of apply .

Комментарии:

1. Боже мой, apply . Вы спасаете

2. Рад решить вашу проблему. Кстати, ваш код вопроса вводит в заблуждение, вы должны прояснить это, т. Е. в нем ничего нет о файлах и модулях.

3. Это не работает, я чувствую, что это связано с тем фактом, что это несколько файлов. Если я не использую module.exports.run or exports.run , это работает нормально, как задумано, но как только они у меня появляются, они перестают работать : (

4. что такое несколько файлов, вы имеете в виду много функций во многих модулях? Вы можете изменить код вашего вопроса, чтобы мне было проще понять, и не забудьте сделать код понятным, точно таким, какой я вам отправил.

5. @программист-новичок?