«Объект был уничтожен» при отправке через IPC - PullRequest
0 голосов
/ 28 марта 2019

Я хочу, чтобы мой электронный интерфейс отправлял данные, предоставленные пользователем, внутреннему интерфейсу через IPC и обрабатывал данные бэкэндом, но также уведомлял интерфейсный модуль о ходе работы, поэтому я прочитал в документации, что для отправки материала, который яследует использовать win.webContents.send(), поэтому я использовал его, но в строке, где он используется, выдается UnhandledPromiseRejectionWarning: Error: Object has been destroyed.

let win: BrowserWindow

app.on('ready', () => {
  win = new BrowserWindow({ width: 600, height: 400 })

  win.loadFile(`/${__dirname}/gui.html`)
})

let sc: Screenshooter

ipcMain.on(
  'fire',
  async (
    event: { sender: { send: (channnel: string, msg: string) => void } },
    e: { url: string; args: object; pauseBefore: boolean }
  ) => {
    sc = new Screenshooter(e.url, e.args)
    event.sender.send('status', 'preparing')

    await sc.prepare().catch(errorExit)

    win.webContents.send('status', 'ready') // UnhandledPromiseRejectionWarning: Error: Object has been destroyed

    // ...
    // more sending contents and operating on object

    }
  }
)

function errorExit(e: any) {
  console.error(e)
  dialog.showErrorBox('Error', 'Error: ' + e)
  process.exit(1)
}

Почему win.webContents.send выдает ошибку en и как я могу это исправить?

1 Ответ

0 голосов
/ 28 марта 2019

Вы получаете ошибку в win.webContents.send, которая приводит к отклонению обещания и не обрабатывается вашим кодом.Оберните код в блок try catch.

// your code

ipcMain.on(
  'fire',
  async(...Params...) => {
    try {
      sc = new Screenshooter(e.url, e.args);
      event.sender.send('status', 'preparing');
      await sc.prepare();
      await win.webContents.send('status', 'ready');
    } catch(e) {
      console.log(e);
    }
  }
) 

Ошибка говорит о том, что ваш объект win больше не существует, он был уничтожен.win - это ссылка на новое окно, похоже, что вы закрываете окно (приводит к уничтожению объекта win), но позже на него ссылаются в ipcMain, и он не может найти объект win.

...