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