Electron - ipcRenderer 在异步模式下不工作 Class
Electron - ipcRenderer not working in Async Class
我有一个带有构造函数和异步函数的 class。
我已经完成 module.exports
以便我可以从我的 GUI.js
文件和我的 GUI.js
文件中调用我的 Class,我要求 class,并且一切正常很好。
但在我的 class 中,我正在尝试这样做 ipcRenderer.send('message', 'Hello');
我收到这个错误:
TypeError: Cannot read property 'send' of undefined
是否可以远程控制我的 GUI.js 中的 ipcRenderer?
谢谢。
我在我的主文件中需要这个模块,在我的渲染器文件中它发送 ipcRenderer.send('startMyClass');
在我的主文件中:ipcMain.on('startMyClass', (event, args) => {
const client = new myClass();
client.Start();
})
这是我的 class/index.js 文件,我的主文件中需要它。
const request = require('request-promise');
const cheerio = require('cheerio');
const { ipcRenderer } = require('electron')
class myClass {
constructor() {
this._jar = request.jar();
this._request = request.defaults({ jar: this._jar });
}
async Start() {
await this.Test();
};
async Test() {
ipcRenderer.send('myMessage', 'Hello');
}
}
module.exports = myClass;
编辑:
如果我不需要它,并且在我的主文件中有整个 class,我可以做 event.sender.send('myMSG', 'hello');
但我想在我的 class 中执行此操作,它与我的主文件不在同一个文件中。
将消息从 Main 发送到 Renderer 应该通过发送到 specific webContents
来完成。这就是 event.sender.send('myMSG', 'hello')
有效而 ipcRenderer.send
无效的原因。后者发送 from Renderer to Main 如文档中所述(而且,无法从 Main 进程访问,因为您的错误告诉您它未定义)。
如 ipcMain
的 docs 中所述,您应该访问要发送到的 webContents
并在其上调用 send
。
所以要更正您的代码,您可以
将对主 window 的引用传递给 myClass
并在其上调用 send
class myClass {
constructor(args) {
// ...
this.mainWindow = args.win
}
// ...
async Test() {
this.mainWindow.webContents.send('myMessage', 'Hello');
}
}
或 send
到真正专注的 window (BrowserWindow.getFocusedWindow()
) 如果这符合您的需要
class myClass {
// ...
async Test() {
BrowserWindow.getFocusedWindow().webContents.send('myMessage', 'Hello');
}
}
我有一个带有构造函数和异步函数的 class。
我已经完成 module.exports
以便我可以从我的 GUI.js
文件和我的 GUI.js
文件中调用我的 Class,我要求 class,并且一切正常很好。
但在我的 class 中,我正在尝试这样做 ipcRenderer.send('message', 'Hello');
我收到这个错误:
TypeError: Cannot read property 'send' of undefined
是否可以远程控制我的 GUI.js 中的 ipcRenderer?
谢谢。
我在我的主文件中需要这个模块,在我的渲染器文件中它发送 ipcRenderer.send('startMyClass');
在我的主文件中:ipcMain.on('startMyClass', (event, args) => {
const client = new myClass();
client.Start();
})
这是我的 class/index.js 文件,我的主文件中需要它。
const request = require('request-promise');
const cheerio = require('cheerio');
const { ipcRenderer } = require('electron')
class myClass {
constructor() {
this._jar = request.jar();
this._request = request.defaults({ jar: this._jar });
}
async Start() {
await this.Test();
};
async Test() {
ipcRenderer.send('myMessage', 'Hello');
}
}
module.exports = myClass;
编辑: 如果我不需要它,并且在我的主文件中有整个 class,我可以做 event.sender.send('myMSG', 'hello');
但我想在我的 class 中执行此操作,它与我的主文件不在同一个文件中。
将消息从 Main 发送到 Renderer 应该通过发送到 specific webContents
来完成。这就是 event.sender.send('myMSG', 'hello')
有效而 ipcRenderer.send
无效的原因。后者发送 from Renderer to Main 如文档中所述(而且,无法从 Main 进程访问,因为您的错误告诉您它未定义)。
如 ipcMain
的 docs 中所述,您应该访问要发送到的 webContents
并在其上调用 send
。
所以要更正您的代码,您可以
将对主 window 的引用传递给
myClass
并在其上调用send
class myClass { constructor(args) { // ... this.mainWindow = args.win } // ... async Test() { this.mainWindow.webContents.send('myMessage', 'Hello'); } }
或
send
到真正专注的 window (BrowserWindow.getFocusedWindow()
) 如果这符合您的需要class myClass { // ... async Test() { BrowserWindow.getFocusedWindow().webContents.send('myMessage', 'Hello'); } }