需要使用单例数组的模块

时间:2018-01-19 18:28:11

标签: javascript arrays node.js singleton electron

我想创建一个非常基本的CRUD(排序)示例应用程序,以查看事情是如何工作的。

我想使用我的 listService.js 中定义的函数(例如addItem(item)getAllItems()等)将项目(购物清单中的项目)存储在数组中上。

在不同的文件中使用相同的模块( listService.js )时出现了问题,因为它创建了多次存储数据的数组,我希望它像一个静态的“全局”(但不是全局变量)数组。

listService.js 如下所示:

    const items = [];

    function addItem (item) {
        items.push(item);
    }

    function getItems () {
        return items;
    }

    module.exports = {addItem, getItems};

我希望在 mainWindowScript.js addWindowScript.js 中使用它,在 addWindowScript.js 中添加我想要的元素添加到数组,并在 mainWindowScript.js 中获取元素并将它们放在表中。 (稍后我将在Observer模式上实现,以便在需要时处理添加表)

addWindowScript.js 看起来像这样:

    const electron = require('electron');
    const {ipcRenderer} = electron;

    const service = require('../../service/listService.js');

    const form = document.querySelector('form');
    form.addEventListener('submit', submitForm);

    function submitForm(e) {
        e.preventDefault();
        const item = document.querySelector("#item").value;

        service.addItem(item);
        console.log(service.getItems());
        // This prints well all the items I add

        // ...
    }

mainWindowScript.js 是这样的:

    const electron = require('electron');

    const service = require('../../service/listService.js');

    const buttonShowAll = document.querySelector("#showAllBtn")
    buttonShowAll.addEventListener("click", () => {
        console.log(service.getItems());
        // This just shows an empty array, after I add the items in the add window
    });

在Java或C#,或C ++或其他什么我只是为每个创建一个类,并在main中我创建一个服务的实例并将它的引用传递给windows。我怎么能在这里做类似的事情?

当我第一次写这个例子时(来自youtube video)我处理了这个问题 通过 ipcRenderer 将消息发送到主模块,然后将其发送到另一个窗口,但每次从一个窗口到另一个窗口发出信号时我都不想处理此消息。

    ipcRenderer.send('item:add', item);

并在主

    ipcMain.on('item:add', (event, item) => {
        mainWindow.webContents.send('item:add', item);
    })

所以,总而言之,我想做一些事情:需要模块,在任何地方使用函数,只有一个对象实例。

1 个答案:

答案 0 :(得分:0)

  

需要模块,在任何地方使用函数,并且只有一个对象实例。

TL:DR - 不,这是不可能的。

长版本:Electron的性质是多进程,您在主进程(node.js端)运行的代码和渲染器(chrome浏览器)在不同的进程中运行。因此,即使您需要相同的模块文件,每个进程中对象创建的内存不同。除了通过ipc通信同步对象之外,没有办法在进程之间共享对象。那里有几个少数同步逻辑模块,或者你可以编写你的模块做那些工作,如

module.js

if (//main process)
// setup object
//listen changes from renderer, update object, broadcast to renderer again

else (//rendere process)
//send changes to main
//listen changes from main

但无论哪种情况你都无法摆脱ipc。