Я пытаюсь выяснить, как выполнить назначение деструктурирования объекта из блока кода, но где принимающие переменные находятся в области видимости модуля, а не внутри блока, где выполняется код, без необходимости повторения определений в нескольких областях ?
Я с радостью использовал присвоение деструктурированных объектов, подобное этому, в области видимости верхнего уровня моего модуля, и это создает кучу переменных верхнего уровня, зависящих от модуля, что и ожидает мой код:
let {
numToRead,
numConcurrent,
numWorkers,
skipParsing,
preOpenFiles,
dir: sourceDir,
binary: doBinary,
} = processArgs(spec);
Этот код выполняется, когда мой модуль запускается как модуль верхнего уровня, и считывает его аргументы непосредственно из командной строки (processArgs()
анализирует командную строку). Но теперь мне нужно изменить код так, чтобы этот код выполнялся условно (он находится внутри блока if
), и иногда аргументы передаются через объект параметров в экспортируемой функции.
Итак, я начал чтобы написать это:
// if executed directly from the command line, get options from the command line
if (require.main === module) {
// module level configuration variables from command line arguments (with defaults)
let {
numToRead,
numConcurrent,
numWorkers,
skipParsing,
preOpenFiles,
dir: sourceDir,
binary: doBinary,
} = processArgs(spec);
// more code here
}
module.exports = function(options) {
// run this from options passed in by another module, rather than the command line
// this code also needs to populate the same top level module variables
}
Но этот блок if
создает все эти переменные внутри области видимости блока, а это не то, что мне нужно. Мне нужно, чтобы они были на верхнем уровне модуля.
Есть ли способ автоматически создать эти переменные на верхнем уровне модуля, когда назначение деструктурирования находится внутри блока без необходимости повторения определения всех переменных верхнего уровня?
Единственный способ заставить его работать - это три отдельных списка именованных переменных верхнего уровня, что кажется плохой практикой что я хотел бы избежать. Можно ли этого избежать и все же получить переменные верхнего уровня:
// top level module arguments
let numToRead = 0,
numConcurrent = 4,
numWorkers = 5,
skipParsing = false,
preOpenFiles = "false",
sourceDir = "./buckets",
doBinary = false;
function run(options) {
// load arguments into top level module variables
({
numToRead,
numConcurrent,
numWorkers,
skipParsing,
preOpenFiles,
dir: sourceDir,
binary: doBinary,
} = options);
analyzeWithWorkers().catch(err => {
console.log(err);
process.exit(1);
});
}
// for running from the command line
if (require.main === module) {
run(processArgs(spec));
}
// for calling this from another module
module.exports = function(options) {
// have to fill in any missing arguments
// here as all options are optional
let fullOptions = Object.assign({
numToRead,
numConcurrent,
numWorkers,
skipParsing,
preOpenFiles,
dir: sourceDir,
binary: doBinary}, options);
run(fullOptions);
}