栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Node.js模块的异步初始化

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Node.js模块的异步初始化

TL; DR:
如果打算在启动时读取本地文件,请使用

readdirSync()
代替
readdir()
。如果您打算实际从远程数据库读取数据或在运行时执行任何I /
O,请使用选项#2-回调。下面的解释和代码示例。

详细说明:

虽然起初这似乎是一个与模块/依赖性/需求相关的问题,但实际上并非如此。这是关于如何处理 异步代码 的通用问题。让我解释:

require()
从根本上讲,它是唯一一个在整个节点中广泛使用的,处理I / O的 同步
功能(它需要文件系统中的其他模块)。同步意味着它实际上将其数据作为返回值返回,而不是调用回调。

异步编程中最基本的101条规则是:

永远无法 采用异步代码段并为其创建同步API。

require
使用称为的特殊 同步
版本。由于模块实际上仅在程序开始时加载,因此在读取模块时会阻塞node.js执行这一事实不是问题。
readFile``readFileSync

在你的榜样然而,试图执行额外的 异步I / O -

readdir()
实现在需要的阶段。因此,您要么需要使用此命令的 同步
版本,要么需要更改API。

因此,存在您问题的背景。

您确定了两个基本选项:

  1. 使用 承诺 (与
    EventEmitter
    示例基本相同)
  2. 使用 回调 (第二个示例很好地说明了这一点),第三个是:
  3. 使用命令的 同步 版本
    readdir()``readdirSync()

为了简单起见,我将使用 选项#3- 但仅当您打算在启动时仅读取几个文件时(如您的示例所示)。如果稍后您的数据库模块实际上将要连接到数据库-
或如果您打算在运行时执行任何上述操作,请立即开始并使用异步API。

不再有多少人记得这一点,但是promise实际上是在node.js中处理异步的原始默认设置。但是,在节点0.1.30中,删除了许可并由带有

function(err,result)
签名的标准化回调代替。这样做主要是出于简化的原因。

如今,绝大多数异步调用都将标准回调作为最后一个参数。您的数据库驱动程序可以做到,您的Web框架也可以做到-随处可见。您应该保持流行的设计并使用它。

选择诺言或事件的唯一原因是,如果您可能会发生 多种不同的结果 。例如,可以打开套接字,接收数据,关闭,刷新等。

这不是你的情况。您的模块始终执行相同操作(读取一些文件)。所以 选择#2 是这样(除非您可以保持 同步 )。

最后,以下是两个稍作重写的制胜法宝:

同步选项:
仅在启动时适合本地文件系统

// db.jsvar fs = require('fs');exports = fs.readdirSync('.');// main.jsvar db = require('./db');// insert rest of your main.js pre here

异步选项:
用于何时要使用数据库等。

// db.jsvar fs = require('fs'), cached_files;exports.init = function(callback) {  if (cached_files) {    callback(null, cached_files);  } else {    fs.readdir('.', function(err, files) {      if (!err) {        cached_files = files;      }      callback(err, files);    });  }};// main.jsrequire('./db').init(function(err, files) {  // insert rest of your main.js pre here});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号