TLDR: la mejor manera de cerrar una ventana del renderizador desde la ventana principal (o el propio renderizador).
Estoy dividiendo un proceso entre X ventanas de representación invisible. Cuando un renderizador termina su trabajo, quiero que envíe un evento al proceso principal y luego se cierre. Ahora mismo tengo
//invisibleRenderer.js doStuff().then(() => { ipcRenderer.invoke('finish'); }¿Cuál es la mejor manera de cerrar la ventana? ¿Está en ipcMain.handle? No puedo averiguar qué método llamar con qué identificación.
ipcMain.handle('finish', (event, args) => { //do what? event.frameId, event.processId, event.sender.id... })Puede usar BrowserWindow.fromId (event.sender.id) para obtener una referencia a la ventana desde donde se originó la llamada IPC, como se demuestra en esta pregunta .
Esto funciona bien en el proceso principal. El siguiente ejemplo abre 5 ventanas y carga el mismo contenido. Cada invocación de secuencia de comandos del renderizador elige un retraso aleatorio (para simular algún trabajo) y luego envía el mensaje de finish al proceso principal. Allí, el proceso principal toma la referencia de BrowserWindow usando event.sender.id y cierra la ventana correspondiente.
aplicación.js
const {app, BrowserWindow, ipcMain} = require("electron"); const windows = []; app.on("ready", function() { for (let i=0; i<5; i++) { let win; win = new BrowserWindow( { width: 300, height: 300, x: i*100, y: i*100, webPreferences: { nodeIntegration: true, contextIsolation: false }, }); win.loadURL(`file://${__dirname}/index.html`); windows.push(win); } }); ipcMain.handle("finish", (event, args) => { const win = BrowserWindow.fromId(event.sender.id); win.close(); });índice.html
<html> <body> Renderer </body> <script type="text/javascript" src="renderer.js"></script> </html>renderizador.js
const {ipcRenderer} = require("electron"); // Simulate some work by choosing a random delay.. const delay = Math.round(Math.random()*10000); setTimeout(() => ipcRenderer.invoke("finish"), delay);