Включите функции разных файлов в Node.js - PullRequest
0 голосов
/ 26 ноября 2018

Хорошо, так ... Я загружаю несколько файлов из папки и хочу, чтобы функции из загруженных файлов были загружены в файл, который загружает файлы.Как будто они были в файле с самого начала.

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

Загрузка всех файлов и включение их функций.

return fs.readdirAsync(path.join(__dirname, 'Handlers')).map(file => {
    if (file.substr(file.length - 3) === '.js') {
        let handlerFile = require(path.join(__dirname, 'Handlers', file))

        for (const handlerName of Object.keys(handlerFile)) {
            this[handlerName] = handlerFile[handlerName]
        }
    }
})

Вот как выглядит загруженный файл:

module.exports = {

    test: (arguments) => {
        console.log(this)
    }

}

Итак, если явызовите this.test () теперь в файле, который загрузил функцию, console.log (this) выполняется.Пока все работает, но «this» пусто.

Есть ли способ, которым загруженная функция получает «this» из файла, который загружает функции?(Не передавая его функции)

Надеюсь, вы понимаете, чего я хочу.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 27 ноября 2018

Значение this не передается автоматически из вашей исходной среды в загруженный модуль.Когда модуль загружается с require(), значение this в этом модуле устанавливается на значение module.exports, и поскольку ваш метод test() объявлен с использованием функции стрелки, значение этого внутри вашего *Метод 1006 * будет лексическим значением this, которое в случае кода, который вы мне показываете, будет исходным значением module.exports (до его переназначения), так как это было this, когда модуль был первоначально загружен.

Если вы вызываете метод .test() с чем-то вроде this.test(), то очень просто исправить это просто прекратить использовать функцию стрелки для вашего метода и использовать обычную функцию.Обычные функции, вызываемые как методы, как в obj.test(), установят значение this равным obj в методе.Если это то, что вы хотите, тогда просто прекратите использовать функцию стрелки.На самом деле, есть очень, очень, очень мало случаев, когда вы хотите, чтобы метод был объявлен с использованием функции стрелки.Методы почти всегда должны быть нормальными определениями функций.Помните, что функция стрелки НЕ является просто синтаксисом ярлыка.Это меняет поведение для установки значения this.

Итак, вы можете просто изменить загруженный файл на это:

module.exports = {

    test: function(args) {
        console.log(this)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...