Node.js 对于需要异步加载大文件才能使用的节点模块,是否有一种通用模式?

Node.js 对于需要异步加载大文件才能使用的节点模块,是否有一种通用模式?,node.js,asynchronous,control-flow,Node.js,Asynchronous,Control Flow,我不喜欢迄今为止看到的任何东西 模块 用法 看起来你要么想 1) 使加载同步 2) 在DooDad上创建一个静态create函数,该函数返回解析为DooDad新实例的承诺 3) 让构造函数返回一个承诺(看起来很奇怪) 4) 在事件加载完成时发出事件 5) 别管它了 6) ??doodad.load()。然后()对我来说非常有意义。您不希望构造函数是异步的,因此将.load()放在异步内容所在的位置是有意义的 我看到的另一种模式是导出一个工厂类型的函数,该函数返回一个承诺,当该承诺被解析时,解析的

我不喜欢迄今为止看到的任何东西

模块 用法 看起来你要么想

1) 使加载同步

2) 在DooDad上创建一个静态
create
函数,该函数返回解析为DooDad新实例的承诺

3) 让构造函数返回一个承诺(看起来很奇怪)

4) 在事件加载完成时发出事件

5) 别管它了

6) ??

doodad.load()。然后()
对我来说非常有意义。您不希望构造函数是异步的,因此将
.load()
放在异步内容所在的位置是有意义的

我看到的另一种模式是导出一个工厂类型的函数,该函数返回一个承诺,当该承诺被解析时,解析的值就是完整形式的对象。这样做的好处是,在异步工作完成之前,无法访问对象,并且在对象准备就绪之前调用代码也不会试图使用它

import makeDooDad from '../doodad'

makeDooDad().then(doodad => {
   // you only get access to the object here after it's been fully
   // initialized
   doodad.doStuff();
});
而且,
makeDooDad()
factory函数在模块内部执行类似的操作:

function makeDooDad() {
   let d = new DooDad();
   // fully initialize the doodad object before resolving the promise
   // and before returning the object
   return d.load().then(() => {
       // let the object itself by the resolved value
       return d;
   });
}
至于你的其他选择:

使加载同步

只有在服务器启动时才可以这样做。在服务器启动时执行一些同步I/O通常没有实际成本,而且通常会使事情简单得多。例如,
require()
本身执行同步I/O

在DooDad上创建一个静态create函数,该函数返回解析为DooDad新实例的承诺

这基本上就是我在上面推荐的factory函数。这往往是一个好的选择

让构造函数返回一个承诺(看起来很奇怪)异步构造函数

不,我真的不想那样做。构造函数应该返回对象,而不是承诺。使用工厂函数返回承诺

在事件加载完成时发出事件

还有其他一些代码可以执行此操作,例如创建writeStream,在流实际打开时在流上发出
open
事件。但是,在承诺的日子里,这不是我最喜欢的处理其他类型对象的方式,这些对象还没有使用很多事件

别管它了


现在还可以,但我更喜欢返回承诺的factory函数。

优点。我喜欢同步,当这没有意义时,我会在工厂根据
出售,这有一个优势,即无法访问对象
@Jason-如果这回答了您的问题,然后,您可以通过单击答案左侧的复选标记来向社区表明这一点,并且还可以通过在堆栈溢出问题上遵循正确的过程来获得一些声誉点。
import makeDooDad from '../doodad'

makeDooDad().then(doodad => {
   // you only get access to the object here after it's been fully
   // initialized
   doodad.doStuff();
});
function makeDooDad() {
   let d = new DooDad();
   // fully initialize the doodad object before resolving the promise
   // and before returning the object
   return d.load().then(() => {
       // let the object itself by the resolved value
       return d;
   });
}