Исправить экспорт функции async в node.js
У меня был свой собственный модуль со следующим кодом:
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
Он работал нормально, если вызывать функцию вне моего модуля, однако, если я вызвал внутри, во время работы я получил ошибку:
(node: 24372) UnhandledPromiseRejectionWarning: Отказ от необработанного обещания (идентификатор отклонения: 1): ReferenceError: PrintNearestStore не определен
Когда я изменил синтаксис на:
module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
Он начал нормально работать внутри модуля, но выходит за пределы модуля - у меня ошибка:
(node: 32422) UnhandledPromiseRejectionWarning: Отказ от необработанного обещания (идентификатор отклонения: 1): TypeError: mymodule.PrintNearestStore не является функцией
Поэтому я изменил код на:
module.exports.PrintNearestStore = async function(session, lat, lon) {
await PrintNearestStore(session, lat, lon);
}
var PrintNearestStore = async function(session, lat, lon) {
...
}
И теперь он работает во всех случаях: внутри и снаружи. Однако хотите понять семантику и если есть более красивый и более короткий способ написать это? Как правильно определить и использовать функцию async как внутри, так и снаружи (экспорт) модуля?
Ответы
Ответ 1
Это не имеет ничего общего с функциями async. Если вы хотите вызвать функцию внутри и экспортировать ее, сначала определите ее, а затем экспортируйте.
async function doStuff() {
// ...
}
// doStuff is defined inside the module so we can call it wherever we want
// Export it to make it available outside
module.exports.doStuff = doStuff;
Объяснение проблем с вашими попытками:
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
Это не определяет функцию в модуле. Определение функции - это выражение функции. Имя выражения функции создает только переменную внутри самой функции. Простой пример:
var foo = function bar() {
console.log(typeof bar); // 'function' - works
};
foo();
console.log(typeof foo); // 'function' - works
console.log(typeof bar); // 'undefined' - there is no such variable 'bar'
Ответ 2
Ошибка с первым случаем: PrintNearestStore
- выражение функции, поэтому это имя недоступно снаружи.
ошибка со вторым случаем: использование переменной, вместо объявления функции. В этом случае объявление переменной PrintNearestStore поднимается, поэтому вы можете использовать это имя до строки var PrintNearestStore =...
, но в этом случае значение будет неопределенным.
Итак, простейшее решение меняет второй вариант:
module.exports.PrintNearestStore = PrintNearestStore;
async function PrintNearestStore(session, lat, lon) {
}