node.js - Electron:主进程和渲染器进程之间的竞争条件
问题描述
在我的 Electron 应用程序中,我看到了奇怪的行为。在 Windows 中,有时渲染器进程会在 Electron 的初始化完成之前执行,这会导致启动时出现问题。例如:我在 Main.ts 文件的构造函数中设置了一个 sequelize 数据库并注册 IPC 通道,因此据我所知,app.on('ready') 事件应该在构造函数完成执行后触发,但有时在 Windows 操作系统中只是,即使在数据库设置之前,就绪事件也会触发,并且我的渲染器进程正在调用数据库以获取 MainWindow 的默认记录。
我认为这是渲染器进程和主进程执行之间的竞争条件,有谁知道如何解决这个问题?
Main.ts
export class Main {
private mainWindow: BrowserWindow;
static instance: Main;
public async init(ipcChannels: IpcChannelInterface[]) {
Main.instance = this;
// Registering the IPC Channels
await this.registerIpcChannels(ipcChannels);
var config = require('../../package.json');
app.setAsDefaultProtocolClient(config.build.protocols.name);
app.setAppUserModelId(config.build.appId);
app.on('ready', Main.createWindow);
app.on('window-all-closed', Main.onWindowAllClosed);
app.on('activate', Main.onActivate);
//Below statement setup the database
await SequelizeDB.setup();
}
}
(new Main()).init([new IpcChannel1(), new IpcChannel2()]);
解决方案
每当电子设置完成时,该ready
事件就会触发。init
它与您的构造函数或方法无关。来自文档:
发射一次,当 Electron 完成初始化时
听起来您是在说您的createWindow
函数依赖于数据库设置函数。在这种情况下,您可以先进行设置:
await SequelizeDB.setup();
await app.whenReady(); // this can replace your on("ready", ...) stuff
Main.createWindow();
推荐阅读
- sql - ms 访问 2000:DSum 的参数太少
- angular - 后端 .netcore 应用程序无法从前端 Angular 站点访问
- angular-material - 更改 mat-select 默认值
- ruby-on-rails - Rails 路由错误 Started PATCH "/category/8" 没有路由匹配 [PATCH] "/8"
- javascript - 如何用相同的类填写表格但输入名称不同
- r - R循环多次向量
- node.js - 面临错误:在运行 Node Js 服务器时找不到模块“C:\Users\DELL\Desktop\node js 程序\文件”
- php - 在 Wordpress 中是否存在打印自定义面包屑以显示所有路径导航的方法?
- css - 移动设备上重叠 div 的问题
- javascript - React:为什么要绑定这个方法?