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

时间:2018-03-02 02:05:47

标签: node.js dependency-injection

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

1 个答案:

答案 0 :(得分:1)

由于NodeJS具有modules caching,因此每次使用<select id="client" style="width: 300px; height: 30px;"> <option value="">SELECT CLIENT</option> <?php $get='SELECT fname,lname FROM client ORDER BY fname'; $result=mysql_query($get); while($row=mysql_fetch_array($result)){ ?> <option value="<?php echo $row['fname'].' '.$row['lname']; ?>"><?php echo $row['fname'].' '.$row['lname']; ?></option> <?php }} ?> </select> <div id="btn_add" style="float: right;" onclick="addonlist($('#client').val(), 3);" class="btn btn-default btn-medium" >ADD</div> <br> <select multiple="multiple" style="width: 355px;" id="clist" name="clist"></select> 导入时都会返回相同的对象实例。但诀窍是你必须导出实例而不是类。

以下是一个例子:

<强>粗-queue.js

require

<强> main.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;

<强>一些-另一file.js

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

<强>尚未另一个-file.js

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

从上面,我们可以看到在对不同文件执行操作时正在使用var thirdImportQueue = require('crud-queue'); console.log(thirdImportQueue); // prints ['banana'] 的相同实例。