NodeJS共享对象无需多次实例化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJS共享对象无需多次实例化相关的知识,希望对你有一定的参考价值。

我有一个在我的NodeJS应用程序中执行CRUD操作的类。它旨在对操作进行排队并按顺序执行它们。截至目前,我在多个其他文件中使用此类,因此,它有多个实例,每个实例都有自己独立的队列。

我的目标是能够在没有多个实例的情况下跨所有其他模块共享相同的队列,以便所有CRUD操作按照它们被调用的顺序依次执行。

//SomeFile.js
var data = new CRUDQueue();
data.addRecord(someRecord); //Pushes an add operation to the internal queue

//SomeOtherFile.js
var data = new CRUDQueue();
data.deleteRecord(someRecord); //Pushes a delete operation to the internal queue

有没有办法可以在这两个文件中共享相同的CRUDQueue对象?最好不使用global或将其传递给构造函数?

答案

由于NodeJS具有modules caching,因此每次使用require导入时都会返回相同的对象实例。但诀窍是你必须导出实例而不是类。

这是一个例子:

原油queue.js

class CRUDQueue {

    constructor (){
        console.log('constructor called'); // will print only once
        this.list = [];
    }

    addRecord (item){
        this.list.push(item);
    }

    deleteRecord (key) {
        var index = this.list.indexOf(key);
        if(index > -1){
            this.list.splice(index, 1);
        }
    }
}

var q = new CRUDQueue(); // this is crucial, one instance is created and cached by Node
module.exports = q;

main.js

var crudQueue = require('./crud-queue');
crudQueue.addRecord('apple');
crudQueue.addRecord('banana');

一些-其他-file.js

var sameInstanceOfCrudQueue = require('crud-queue');
sameInstanceOfCrudQueue.deleteRecord('apple');

尚未另一个-file.js

var thirdImportQueue = require('crud-queue');
console.log(thirdImportQueue); // prints ['banana']

从上面,我们可以看到在对不同文件执行操作时正在使用相同的CRUDQueue实例。

以上是关于NodeJS共享对象无需多次实例化的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS构造自定义对象而不需要该文件

php DI实现实例:

创建片段而不从 java 代码实例化它

实例化一个对象,以便它可以与多个指令共享

片段事务中的实例化错误

如何独立多次加载共享对象