gpt4 book ai didi

javascript - 更正 node.js 中的异步函数导出

转载 作者:IT老高 更新时间:2023-10-28 21:58:56 25 4
gpt4 key购买 nike

我的自定义模块包含以下代码:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}

如果在我的模块外部调用该函数,它工作正常,但是如果我在内部调用,我在运行时出错:

(node:24372) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: PrintNearestStore is not defined

当我将语法更改为:

module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

它开始在模块内正常工作,但在模块外失败 - 我收到错误:

(node:32422) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: mymodule.PrintNearestStore is not a function

所以我将代码更改为:

module.exports.PrintNearestStore = async function(session, lat, lon) {
await PrintNearestStore(session, lat, lon);
}

var PrintNearestStore = async function(session, lat, lon) {
...
}

现在它适用于所有情况:内部和外部。但是想了解语义,如果有更漂亮和更短的方法来编写它?如何正确定义和使用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`

另见 Named function expressions demystified .如果您想在任何地方引用 module.exports.PrintNearestStore,您当然可以引用该函数。


module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

几乎没问题。问题是当您将 PrintNearestStore 的值分配给 module.exports.PrintNearestStore 时,它的值是 undefined。执行顺序为:

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`

关于javascript - 更正 node.js 中的异步函数导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com