ответить на webContents.send - PullRequest
       70

ответить на webContents.send

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

Насколько я понимаю, вы не можете отвечать от обработанного процесса на события, отправленные основным процессом. Вы можете сделать то же самое, когда связь переходит от процесса визуализации к основному процессу:

// 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;
    });
  }
},

Есть ли способ отправить какой-либо ответ на событие, отправленное из основного процесса

...