提供 Promise 作为模块的导出是不是是 Node.js 中异步初始化的有效模式?

Posted

技术标签:

【中文标题】提供 Promise 作为模块的导出是不是是 Node.js 中异步初始化的有效模式?【英文标题】:Is providing a Promise as a module's export a valid pattern for asynch initialization in Node.js?提供 Promise 作为模块的导出是否是 Node.js 中异步初始化的有效模式? 【发布时间】:2015-12-22 19:58:32 【问题描述】:

我需要编写一些模块来一次加载数据,然后为该数据提供一个接口。我想异步加载数据。我的应用程序已经使用了 Promise。作为要求模块的结果提供一个承诺是有效的模式/习语吗?

示例模块:

var DB = require('promise-based-db-module');

module.exports =
  DB.fetch('foo')
  .then(function(foo)
    return 
        getId: function()return foo.id;,
        getName: function()return foo.name;
    ;
  );

示例用法:

require('./myPromiseModule')
.then(function(dataInterface)
  // Use the data
);

更新:

我已经用了一段时间了,效果很好。我学到的一件事,在接受的答案中有所暗示,那就是缓存 Promise 本身是很好的,每当你想访问数据时,请使用 then。第一次访问数据时,代码将等待直到 promise 被解析。后续使用then 将立即返回数据。例如

var cachedPromise = require('./myPromiseModule');
cachedPromise.then(function(dataInterface)
  // Use the data
);
...
cachedPromise.then(function(dataInterface)
  // Use the data again somewhere else.
);

【问题讨论】:

看起来对我来说效果很好。 是的,看起来非常好。如果您使用的是 ES6 模块,您甚至可以使用 Promise-aware 模块加载器,以及 import“同步”。 以下答案是否解决了您的问题?如果是这样,请通过选中该答案左侧的绿色复选标记将最佳答案标记为已接受答案,以向社区表明您的问题已得到解答,然后您和提供答案的人都将获得一些声誉积分这可以在 *** 上获得更多特权。 【参考方案1】:

对于一个工作是一次性获取一些数据的模块来说,这似乎是一个非常好的接口。

数据是异步获取的,所以一个承诺是有意义的。目标是只获取一次数据,然后让使用该模块的所有地方都可以访问该原始数据。 Promise 也适用于此,因为它是一种可以记住其状态的一次性设备。

就我个人而言,我不知道为什么您需要 getId()getName() 方法,而您只能提供对属性的直接访问,但两者都可以工作。

此接口的一个缺点是无法请求数据的新副本(从数据库中新加载)。

【讨论】:

谢谢!这基本上就是我的想法,但我想确保我没有偏离基地。奖励:我想知道这是否已经在野外完成了?我会赞成第一个(也许更多)评论,该评论链接到 npm 中执行此操作的库(在我写问题之前发布)。 我添加了访问器 b/c 我不想为加载的数据提供写访问权限。只称它们为 id 和 name 可能会更惯用。我可能会也可能不会使用一种未命名的语言进行编程,而这种命名约定是标准的。 :)

以上是关于提供 Promise 作为模块的导出是不是是 Node.js 中异步初始化的有效模式?的主要内容,如果未能解决你的问题,请参考以下文章

导出原始 .ts 文件而不是 .d.ts 文件作为模块类型声明的后果

导入Promise的正确方法是什么?

如何从另一个模块调用导出的内核模块函数?

Webpack 向带有导出的模块添加“不提供导出”

“.then(function(a) return a; )” 是 promise 的 no-op 吗?

如何在 node.js 中的模块之间共享连接池?