我有一个Electron应用程序,当用户关闭它时需要保存一些数据(例如,在用户单击“关闭”按钮后)。
数据在渲染器进程中可用,因此应该在应用程序死亡之前通知它。
Electron API for Browser Window提到了一个close
方法,但似乎这是由主进程完成的,而不是渲染器(如果我没有弄错的话)。
我尝试从主进程使用WebContents.send
来通知渲染器进程,但由于消息是异步的,因此应用程序在渲染器进程有时间实际执行操作之前就关闭了。
我有一个Electron应用程序,当用户关闭它时需要保存一些数据(例如,在用户单击“关闭”按钮后)。
数据在渲染器进程中可用,因此应该在应用程序死亡之前通知它。
Electron API for Browser Window提到了一个close
方法,但似乎这是由主进程完成的,而不是渲染器(如果我没有弄错的话)。
我尝试从主进程使用WebContents.send
来通知渲染器进程,但由于消息是异步的,因此应用程序在渲染器进程有时间实际执行操作之前就关闭了。
3条答案
按热度按时间apeeds0o1#
您可以在渲染器进程中使用普通的
unload
或beforeunload
事件:lvjbypge2#
到目前为止,对我有效的最简单的解决方案包括执行以下操作:
1.在主进程上,BrowserWindow监听
close
事件,当它发生时,它通过webContents向渲染器进程发送一条消息。它还防止应用程序通过调用event.preventDefault()
立即关闭;1.渲染器进程始终是主进程的listening on IPC messages,然后当它收到
close
事件通知时,它保存它的数据,然后向主进程发送IPC消息(例如closed
);1.主进程之前已经设置了一个钩子来监听渲染器IPC消息(
ipcMain.on
),所以当closed
消息到达时,它最终关闭程序(例如通过app.quit()
)。请注意,如果我理解正确的话,调用
app.quit()
会向BrowserWindow发送另一个close
事件,所以它会循环,除非你以某种方式阻止它。我使用了一个肮脏的技巧(在调用close
事件的第二次退出,而不调用event.preventDefault()
),但一定存在更好的解决方案。7xllpg7q3#
在主进程上:
在渲染器进程上: