Ответ 1
Модули в Node, загруженные с помощью require()
, загружаются синхронно, и невозможно, чтобы require
возвращало любое значение, которое загружается асинхронно. Он может вернуть обещание, но пользователи этого модуля должны будут использовать его как:
require('module-name').then(value => {
// you have your value here
});
Невозможно было бы написать:
var value = require('module-name');
// you cannot have your value here because this line
// will get evaluated before that value is available
Конечно, вы можете иметь обещание, разрешенное внутри вашего модуля, и настроить его на экспортируемый объект, добавив что-то вроде этого:
module.exports = { GEM_HOME: null };
и изменения:
module.exports = GEM_HOME
в
module.exports.GEM_HOME = GEM_HOME
В этом случае каждый другой модуль, который использует этот модуль как:
var x = require('module-name');
будет иметь x.GEM_HOME
, первоначально установленный в null
, но позже он будет изменен на правильное значение. Он был бы недоступен сразу же, потому что require()
возвращается до того, как обещание будет установлено, и значение будет установлено.
Продолжается дискуссия по внедрению асинхронной загрузки модуля с различным синтаксисом и семантикой, которые могут быть пригодны для вашего использования. Это противоречивые сюжеты, и стоит прочитать все обоснования, стоящие за ним - см.:
- Node.js, TC-39 и модули Джеймса М Снелла из iBM
- Функциональность модуля ES6 - Node.js Предложения по улучшению
- В защиту .js - Предложение для Node.js Модули Дейва Хермана, Иегуды Каца и Кариди Патиньо
- Обсуждение Запрос Pull № 3 из node -eps (002: интерфейс модуля ES6)
См. также этот ответ для более подробной информации: