Как сделать объект окна Electron доступным из асин c функции без глобальных? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь сделать экземпляр объекта BrowserWindow в приложении Electron доступным для меню приложения, чтобы команда меню могла использовать ссылку для открытия базы данных IndexedDB. Поскольку я создаю экземпляр mainWindow внутри немедленно вызываемой асинхронной c функции, неясно, как лучше сделать этот объект доступным в коде в требуемом файле.

index. js (основной процесс)

let mainWindow;
//other code here

(async () => {
    await app.whenReady();
    Menu.setApplicationMenu(menu);

    mainWindow = await createMainWindow();
    //make mainWindow available in required menu.js file
    //so it can be referenced from menu command
    //to access indexedDB database

})();

Я бы хотел, чтобы объект был доступен в меню. js, что требуется для индекса. js.

    //menu setup
    {
        label: "Add Item to Database",
        click() {
                  //undefined unless object can be imported
                  //dialog code for inputting data to be added
                  mainWindow.webContents.send("addItem", data);
                }
    },

Я мог бы хранить mainWindow в глобальном объекте но я пытаюсь избежать этого. Я также мог бы создать метод для объекта Menu и сохранить его там, так как он доступен в меню. js. Я не уверен, что это хорошая идея. И я полагаю, я мог бы просто добавить код меню. js в индекс. js, поскольку mainWindow находилось бы в области видимости и было бы назначено ко времени использования команды меню. Но я предполагаю, что есть лучший способ сделать это. Предложения

1 Ответ

1 голос
/ 19 апреля 2020

Чтобы обойти объект без использования глобальных переменных, общая схема заключается в использовании аргументов функции.

Похоже, menu.js экспортирует object сейчас. Вместо этого вы можете экспортировать функцию, которая возвращает вместо этого этот объект.

Затем, вместо вызова Menu.setApplicationMenu(menu);, вы бы вызвали Menu.setApplicationMenu(menu(mainWindow));, и вы хороши для go.

Вот пример menu.js:

module.exports = (mainWindow) => {
  label: "Add Item to Database",
  click: ()  => {
    //undefined unless object can be imported
    //dialog code for inputting data to be added
    mainWindow.webContents.send("addItem", data);
  }
};
...