通过IPC发送时,“对象已被破坏”

时间:2019-03-28 10:51:43

标签: javascript typescript electron

我希望我的电子前端将用户提供的数据通过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为什么会引发错误,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您在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对象。