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

问题描述 投票:1回答:1

我有一个在我的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或将其传递给构造函数?

node.js dependency-injection
1个回答
1
投票

由于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实例。

© www.soinside.com 2019 - 2024. All rights reserved.