当前位置: 首页 > 面试题库 >

提供Promise作为模块的输出是否是Node.js中用于初始化初始化的有效模式?

颜高朗
2023-03-14
问题内容

我需要编写一些模块,一次加载数据,然后提供该数据的接口。我想异步加载数据。我的应用程序已经使用了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
});

更新:

我已经使用了一段时间了,效果很好。我已经了解到的一件事(在已接受的答案中得到了暗示)是,缓存承诺本身以及在每次访问数据使用时都很好then。第一次访问数据时,代码将等待直到承诺被解决。的后续使用then将立即返回数据。例如

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

问题答案:

对于一个模块来说,这似乎是一个完美的界面,该模块的任务是一次性读取某些数据。

数据是异步获取的,因此对此应有承诺。目标是只获取一次数据,然后让该模块使用的所有位置都可以访问该原始数据。一个诺言也很有效,因为它是一个记住其状态的一次性装置。

就我个人而言,我不确定为什么只可以直接访问属性时为什么需要getId()and getName()方法,但是两者都可以使用。

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



 类似资料:
  • 问题内容: 我想以异步方式初始化模块,并提出一些想法。我需要具有Mongo集合列表和其他数据的DB对象,但是为了简洁起见,其中的文件列表确实有用。 我无法导出函数或类,因为我每次都需要返回相同的对象。 首先 想到的最简单的方法是分配给它,然后填充它: 不好的事情–我真的从外面不知道什么时候准备好列表,也没有检查错误的好方法。 *我想出的 *第二种 方法是继承并通知所有人数据库已准备就绪或发生了错误

  • 由于此错误,无法安装gulp和其他插件,但express,Socket.io已成功安装

  • 问题内容: 我知道您可以在实例化期间初始化数组,如下所示: 有没有办法用ArrayList做同样的事情?还是我必须单独添加内容? 问题答案: Arrays.asList可以在这里提供帮助:

  • 问题内容: 我是来自C 背景的Python新手。虽然我知道用我以前的C 知识来尝试找到匹配的概念并不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C 中,由于C 无法确定哪个全局/静态变量将首先在编译单元中初始化,因此存在一个众所周知的全局/静态变量初始化顺序失败的问题,因此,全局/静态变量取决于不同编译中的另一个变量单元可能比其依赖项对应的对象早初始化,并且当依赖项开始使用依赖项

  • 根据此堆栈溢出问题的公认(且唯一)答案, 使用 将改为零初始化对象。 那么,为什么呢?, 生成此输出: 定义的两个构造函数都是默认的?正当对于POD类型,默认初始化为零初始化。 根据这个问题的公认答案, 如果POD成员未在构造函数中初始化,也未在类初始化中通过C11初始化,则默认为已初始化。 不管是堆栈还是堆,答案都是一样的。 在C 98中(而不是之后),new int()被指定为执行零初始化。

  • 问题内容: 我们可以将代码放入构造函数或方法或初始化块中。初始化块有什么用?每个Java程序都必须有它吗? 问题答案: 首先,有两种类型的初始化块: 实例初始化块,以及 静态初始化块。 此代码应说明它们的用法以及执行顺序: 印刷品: 如果要运行某些代码而不管使用哪个构造函数,或者想要对匿名类进行一些实例初始化,则实例迭代块很有用。