我的自定义模块包含以下代码:
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
如果在我的模块外部调用函数,它工作正常,但如果我调用内部运行时出错:
(node:24372)UnhandledPromiseRejectionWarning:未处理的承诺 rejection(拒绝id:1):ReferenceError:PrintNearestStore不是 定义
当我将语法更改为:
时module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
它开始在模块内部工作正常,但在模块外部失败 - 我收到错误:
(node:32422)UnhandledPromiseRejectionWarning:未处理的承诺 rejection(拒绝id: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 功能:内部和外部(导出)模块?
答案 0 :(得分:38)
这与异步函数没有任何关系。如果要在内部调用函数并将其导出,请先将其定义为 ,然后将其导出。
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`
另见Named function expressions demystified。如果你在任何地方都引用module.exports.PrintNearestStore
,你当然可以参考这个函数。
module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
这几乎确定。问题是,PrintNearestStore
的值在undefined
分配时为module.exports.PrintNearestStore
。执行顺序是:
var PrintNearestStore; // `undefined` by default
// still `undefined`, hence `module.exports.PrintNearestStore` is `undefined`
module.exports.PrintNearestStore = PrintNearestStore;
PrintNearestStore = async function(session, lat, lon) {}
// now has a function as value, but it's too late
更简单的例子:
var foo = bar;
console.log(foo, bar); // logs `undefined`, `undefined` because `bar` is `undefined`
var bar = 21;
console.log(foo, bar); // logs `undefined`, `21`
如果您更改了订单,它将按预期工作。
module.exports.PrintNearestStore = async function(session, lat, lon) {
await PrintNearestStore(session, lat, lon);
}
var PrintNearestStore = async function(session, lat, lon) {
...
}
这是有效的,因为时间分配给module.exports.PrintNearestStore
的函数被执行,PrintNearestStore
将函数作为其值。
更简单的例子:
var foo = function() {
console.log(bar);
};
foo(); // logs `undefined`
var bar = 21;
foo(); // logs `21`
答案 1 :(得分:2)
第一种情况出错:PrintNearestStore
- 函数表达式,因此该名称在外面不可用。
第二种情况的错误:使用变量,而不是函数声明。在这种情况下,变量PrintNearestStore的声明被提升,因此,您可以在行 因此,最简单的解决方案会改变第二种变体:var PrintNearestStore = ...
之前使用此名称,但在这种情况下,值将是 undefined 。< / p>
module.exports.PrintNearestStore = PrintNearestStore;
async function PrintNearestStore(session, lat, lon) {
}
答案 2 :(得分:1)
export let handlePostStore = async (data) => {
console.log('post');
return data;
};
// to import
import { handlePostStore } from 'your_path_here';
// to call it
handlePostStore(data)
答案 3 :(得分:0)
一些例子:
module.exports.func1 = async function func1(id) { // name is preferred by linter
//
};
module.exports.func1 = async function (id) { // ok
//
};
module.exports.func1 = async (id) => { // simpler
//
};