我怎样才能最好地处理以下情况?

我有一个构造函数需要一段时间才能完成.

var Element = function Element(name){
   this.name = name;
   this.nucleus = {};

   this.load_nucleus(name); // This might take a second.
}

var oxygen = new Element('oxygen');
console.log(oxygen.nucleus); // Returns {}, because load_nucleus hasn't finished.

我看到三种 Select ,每一种似乎都不寻常.

One,向构造函数添加回调.

var Element = function Element(name, fn){
   this.name = name;
   this.nucleus = {};

   this.load_nucleus(name, function(){
      fn(); // Now continue.
   });
}

Element.prototype.load_nucleus(name, fn){
   fs.readFile(name+'.json', function(err, data) {
      this.nucleus = JSON.parse(data); 
      fn();
   });
}

var oxygen = new Element('oxygen', function(){  
   console.log(oxygen.nucleus);
});

Two,使用EventEmitter发出"已加载"事件.

var Element = function Element(name){
   this.name = name;
   this.nucleus = {};

   this.load_nucleus(name); // This might take a second.
}

Element.prototype.load_nucleus(name){
   var self = this;
   fs.readFile(name+'.json', function(err, data) {
      self.nucleus = JSON.parse(data); 
      self.emit('loaded');
   });
}

util.inherits(Element, events.EventEmitter);

var oxygen = new Element('oxygen');
oxygen.once('loaded', function(){
   console.log(this.nucleus);
});

Or three,阻止建造师.

var Element = function Element(name){
   this.name = name;
   this.nucleus = {};

   this.load_nucleus(name); // This might take a second.
}

Element.prototype.load_nucleus(name, fn){
   this.nucleus = JSON.parse(fs.readFileSync(name+'.json'));
}

var oxygen = new Element('oxygen');
console.log(oxygen.nucleus)

但我以前从没见过这样的事.

我还有什么 Select ?

推荐答案

考虑到避免在 node 中阻塞的必要性,使用事件或回调并不奇怪.

只需稍微编辑两个,就可以将其与一个合并:

var Element = function Element(name, fn){
    this.name = name;
    this.nucleus = {};

    if (fn) this.on('loaded', fn);

    this.load_nucleus(name); // This might take a second.
}

...

不过,与示例中的fs.readFile一样,核心 node API(至少)通常遵循静态函数的模式,在数据准备就绪时公开实例:

var Element = function Element(name, nucleus) {
    this.name = name;
    this.nucleus = nucleus;
};

Element.create = function (name, fn) {
    fs.readFile(name+'.json', function(err, data) {
        var nucleus = err ? null : JSON.parse(data);
        fn(err, new Element(name, nucleus));
    });
};

Element.create('oxygen', function (err, elem) {
    if (!err) {
        console.log(elem.name, elem.nucleus);
    }
});

(1) 读取JSON文件不需要很长时间.如果是这样的话,可能是为了数据而改变存储系统.

Node.js相关问答推荐

如何使用updateMany()和Node.js的方法?

GitLab SAST中的Nodejcan未找到匹配项

Sass-TypeError:无法读取未定义的属性(正在读取';indexOf';)

Webpack:如何避免导出函数的重命名?

即使卷已设置,Docker Nodemon 也不会热重载

将图像添加到多个产品的条带 checkout 会话中

处理嵌套元素时,使用xml2js库解析XML时发生错误

在 MacOS Ventura 上使用 NVM 安装 node ?

处理 UTC 日期和future

在快速路由中使用 axios 会在数据字段中返回特殊字符而不是 json

后端位于 Docker 容器中时的 SvelteKit SSR fetch()

GridFS 大文件下载使 Node.js 服务器崩溃. MongoServerError:排序超出了字节的内存限制

cURL 和 shell 任务

解决并行保存到 mongodb

什么是nestjs错误处理方式(业务逻辑错误vs.http错误)?

在本地运行 Cloud Functions 会出现错误functions.config() 不可用

npm 不会安装 express 吗?

socket.io 发出回调合适吗?

在 Jade 包含中使用变量

#!/bin/env是什么意思(在 node.js 脚本的顶部)?