Насколько я понимаю, вы не можете отвечать от обработанного процесса на события, отправленные основным процессом. Вы можете сделать то же самое, когда связь переходит от процесса визуализации к основному процессу:
// Renderer process
ipcRenderer.invoke('some-name', someArgument).then((result) => {
// ...
})
// Main process
ipcMain.handle('some-name', async (event, someArgument) => {
const result = await doSomeWork(someArgument)
return result
})
Источник: https://github.com/electron/electron/blob/master/docs/api/ipc-renderer.md#ipcrendererinvokechannel -args
Мне нужен противоположность этому для простой вещи отменить / повторить, и это то, что я использую в настоящее время:
mainProcess.js:
// somewhere in the menu template
{
id: 'undo',
label: 'Undo',
accelerator: 'Command+Z',
selector: 'undo:',
click: () => {
this.mainWindow.webContents.send('undo-request');
}
},
// down in the main process
ipcMain.on('undo-response', (_event, { canUndo }) => {
const appMenu = Menu.getApplicationMenu();
const undoMenuItem = appMenu.getMenuItemById('undo');
undoMenuItem.enabled = canUndo;
});
renderer.js:
ipcRenderer.on('undo-request', () => {
canvas?.getCommandStack().undo();
ipcRenderer.send('undo-response', canvas?.getCommandStack().canUnod());
})
Если mainProcess также может ожидать обещание, дополнительное событие undo-response
не понадобится:
// somewhere in the menu template
{
id: 'undo',
label: 'Undo',
accelerator: 'Command+Z',
selector: 'undo:',
click: () => {
this.mainWindow.webContents.send('undo-request').then(({ canUndo }) => {
const appMenu = Menu.getApplicationMenu();
const undoMenuItem = appMenu.getMenuItemById('undo');
undoMenuItem.enabled = canUndo;
});
}
},
Есть ли способ отправить какой-либо ответ на событие, отправленное из основного процесса