当前位置: 首页 > 知识库问答 >
问题:

在节点中正确导出异步函数。js

陈志
2023-03-14

我的自定义模块具有以下代码:

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

如果在我的模块外调用函数,效果很好,但是如果在模块内调用,则在运行时出现错误:

(节点: 24372)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 1):引用错误:未定义PrintNearestStore

当我将语法更改为:

module.exports.PrintNearestStore = PrintNearestStore;

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

}

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

(节点: 32422)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 1): TypeError: my模块。PrintNearestStore不是一个函数

所以我将代码更改为:

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

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

现在它在所有情况下都有效:内部和外部。然而,想了解语义学,如果有更美丽和更短的方法来写呢?如何正确定义和使用异步函数:内部和外部(导出)模块?

共有3个答案

施季
2023-03-14
export let handlePostStore = async (data) => {
    console.log('post');
    return data;
};

// to import 
import { handlePostStore } from 'your_path_here';

// to call it 
handlePostStore(data)
郏扬
2023-03-14

第一种情况下出错:PrintNearestStore-函数表达式,因此此名称在外部不可用。

第二种情况下出错:使用变量,而不是函数声明。在本例中,变量PrintNearestStore的声明被挂起,因此,您可以在第var printnearestore= ,但在这种情况下,值将是未定义的。

所以,最简单的解决方案将第二个变量更改为:

module.exports.PrintNearestStore = PrintNearestStore;

async function PrintNearestStore(session, lat, lon) {

}

吕宸
2023-03-14

这与异步函数没有什么特别的关系。如果你想在内部调用一个函数并导出它,首先定义它,然后导出它。

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) {
...
}

这不会在模块中定义函数。函数定义是一个函数表达式。函数表达式的名称仅在函数本身内部创建变量。更简单的例子:

js prettyprint-override">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`
 类似资料:
  • 我有以下代码,这是通过Express调用的API。我需要返回一个引号数组,以及与这些引号相关联的部分数组。为此,我使用async/wait,它在我的引号变量中正常工作,但我在部件变量中得到一个空数组。 我相信这与部分结果是挂起的promise有关,因为当我在循环中记录我的结果时,我得到了适当的值。 我怀疑我一定是误解了async/await是如何工作的,或者promises/Promise是如何工

  • 问题内容: 我正在使用GraphicsMagick作为节点。我基本上是裁剪照片并检索用户上传的照片的exif数据。我不想阻塞等待这些任务完成的请求流,因此我需要使用异步函数来做到这一点。而且我认为我应该能够这样做,因为这些是node.js本身进行异步的I / O操作。 但是,正如我所见,GraphicsMagick中节点的所有功能都是同步功能。因此,我无法确定如何实现所需的功能。 我想到的一个想法

  • 我已经为更新的节点版本编写了代码,我希望将其实现为谷歌云功能(GCF)。现在的问题是GCF只提供节点v6.14.0引擎,不支持异步功能。 我喜欢的解决方案是使用https://www.npmjs.com/package/asyncawait,因为我不需要做重大更改(当我后来希望在新的节点可用时使用本机异步时也同样适用)。然而,我无法运行我的代码,即使我相信我已经正确地遵循了转换中的示例。 如果我按

  • 我正在尝试使用节点版本6.2.1与我的一些代码。计划将大多数面向超回调的代码迁移到看起来更干净、性能更好的代码。 我不知道为什么,当我试图执行节点代码时,终端抛出了一个错误。 你好。js 日志- 我错过了什么?请给我一些同样的灯。 更新1: 我试着按照昆汀的建议使用巴贝尔,但是,我仍然得到以下错误。 更新代码- 日志-

  • 问题内容: 我认为节点7.4支持异步/等待,但是此示例不起作用: 结果是: 如何在节点7.4上使用异步/等待? 问题答案: 是的,Node.js v7支持async-await,但将其锁定在标志后面。尚未准备就绪的功能不在此标记后面。 要在Node.js v7中使用async-await,只需使用此标志运行Node服务- async-await的正式发行版预定于4月启动的Node.js v8。 您

  • 我以为async/wait在节点7.4中得到了支持,但是这个例子不起作用: 结果: 如何在node 7.4中使用async/await?