- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我制作了一个简单的 Electron
应用程序,它使用 ipcMain
和 ipcRenderer
。这是代码,这是有道理的:
main.js
const { app, BrowserWindow, ipcMain } = require('electron')
const { spawn, exec } = require('child_process')
let win
function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
minWidth: 610,
minHeight: 470,
webPreferences: {
nodeIntegration: true
}
})
win.loadFile('index.html')
win.webContents.openDevTools()
}
app.on('ready', createWindow)
ipcMain.on("checkPerl", function(e){
tryToRun("perl", ["-v"])
.then(function(){ e.reply("checkPerlReply", true) })
.catch(function(){ e.reply("checkPerlReply", false) })
})
function tryToRun(cmd, args){
return new Promise(function(resolve, reject){
// some code
})
}
renderer.js
const { ipcRenderer } = require('electron')
class Chdump {
checkPerl(){
this.message("Проверяем Perl...")
let p = new Promise(function(resolve, reject){
ipcRenderer.send("checkPerl", true)
ipcRenderer.on("checkPerlReply", function(event, res){
if (res) resolve()
else reject()
})
})
return p
}
start(){
let self = this
this.checkPerl()
.then(function(){ console.log("Perl is installed") })
.catch(function(){ console.log("Perl is not installed") })
}
}
let app = new Chdump()
app.start()
我跳过了一些与问题无关的代码。当我使用 NodeJS 使用 electron .
运行此代码时,此代码运行正常,但在打包应用程序后,我收到以下错误:
UnhandledPromiseRejectionWarning: TypeError: e.reply is not a function
此错误引用了 main.js 中的以下字符串:
tryToRun("perl", ["-v"])
.then(function(){ e.reply("checkPerlReply", true) })
.catch(function(){ e.reply("checkPerlReply", false) })
我添加了 console.log(e)
来查看事件对象并获得以下内容:
{ preventDefault: [Function: preventDefault],
sender:
WebContents {
webContents: [Circular],
history:
[ 'file:///home/kolesnikov/changedump/resources/app/index.html' ],
currentIndex: 0,
pendingIndex: -1,
inPageIndex: -1,
_events:
{ 'navigation-entry-commited': [Function],
'ipc-message': [Function],
'ipc-message-sync': [Function],
'pepper-context-menu': [Function],
'-did-get-response-details': [Function],
'-did-get-redirect-request': [Function],
'devtools-reload-page': [Function],
'-new-window': [Function],
'-web-contents-created': [Function],
'-add-new-contents': [Function],
'will-navigate': [Function],
'did-navigate': [Function],
destroyed: [Function],
'devtools-opened': [Function],
move: [Function],
activate: [Function],
'page-title-updated': [Function] },
_eventsCount: 17,
_maxListeners: 0,
browserWindowOptions:
{ width: 800,
height: 600,
minWidth: 610,
minHeight: 470,
webPreferences: [Object] } } }
我尝试对使用 NodeJS 运行的非打包应用程序执行相同的操作,但得到了令人惊讶的不同结果:
{ preventDefault: [Function: preventDefault],
// [...] looks the same as a previous object
frameId: 1,
reply: [Function] }
第二个 Event
对象看起来不错,并且它有一个 reply
属性。我还是不明白,为什么 electron
Event 对象在打包后没有 reply
属性。
你有什么想法吗?
最佳答案
使用 e.sender.send 代替 e.reply
ipcMain.on("checkPerl", function(e){
tryToRun("perl", ["-v"])
.then(function(){ e.sender.send("checkPerlReply", true) })
.catch(function(){ e.sender.send("checkPerlReply", false) })
})
关于node.js - ipcMain : event. 回复不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57038073/
我们可以为 ipcMain.on 方法和 ipcMain.handle() 注册相同的 channel 吗? 例如: ipcMain.handle('test', async(event,args)
最近,我一直在开发Windows应用程序(使用Electronjs)来加密文件。我想要它,这样当我按下渲染器中的第一个按钮时,它将发送到主进程,要求它打开打开文件对话框。我尝试了这段代码。 rende
它总是返回未定义的,请问有什么想法吗? 我需要在fs.reddir中返回,但相对于ipcMain //main ipcMain.handle('pegaDirRomSalvo', async (eve
我正在 react 中创建一个拖放并使用 Electron 发送和接收我的文件数据。我在 console.log 中收到 senderId 和 sender。我怎样才能让数据出现?我错过了什么? Dr
我有一个函数可以向 ipcMain 发送查询,然后等待运行 SQL 查询。当响应返回时,我遍历返回的数据并将其显示在屏幕上以供用户查看。 出于某种原因,无论何时返回数据并且我从渲染过程中记录它,它都会
下面的代码会产生错误 const ipcMain = require('electron').ipcMain; ipcMain.on('open-file-dialog', function (eve
我正在尝试了解 Electron 主进程和渲染器进程之间的通信。文档 https://github.com/electron/electron/blob/master/docs/api/remote.
这是情况。 可通过main.js中的nodejs(node-adodb)直接访问该数据库。我的Angular应用发送请求并从db.service接收sql结果。这部分工作正常,但是如果我有一个类似ge
我对一件奇怪的事情感到有点困惑。我希望我能得到一些关于这种行为的解释。 这是我的小学习项目。一个简单的tcp客户端-服务器聊天程序。客户端是用Electron编写的,但还没有运行。 我的聊天模块是:
我制作了一个简单的 Electron 应用程序,它使用 ipcMain 和 ipcRenderer。这是代码,这是有道理的: main.js const { app, BrowserWindow, i
我正在用 Electron js 编写一个桌面应用程序,我想将数据从我的主进程发送到我的渲染器进程,反之亦然。为此,我使用 ipcMain和 ipcRenderer ,但很奇怪,同时能够通过我的渲染器
我的应用程序打开了两个窗口,其中一个应该在投影仪上(第二个监视器)打开。我正在尝试使其正常运行,以便如果在未连接投影仪的情况下打开应用程序,则用户可以连接投影仪,然后单击按钮并按下第二个窗口。如果他们
我正在使用 Angular/Electron 构建应用。在 Angular 组件中,我有一个方法 - handleData() - 定义一个对象 - 只是简单的数组、字符串、数字等,没有异步调用或任何
我的问题是当我从渲染器进程调用 ipcMain 操作时渲染器线程被卡住,直到 ipcMain 操作完成(同步而不是异步) 代码示例: 渲染器.js export const startCopy = d
我正在开发一个 Electron 应用程序,总体来说我有一个架构问题。 每当我需要在主进程中完成某些操作时,我都会直接在 main.js 文件中完成它,我相信这是错误的,因为我最终会得到一个非常长的整
我克隆了electronic-quick-start演示,并测试了ipcMain函数。 按照文档在main.js中添加此文件 const { ipcMain } = require('electron
我有一个 Electron 应用程序,它首先启动一个启动器窗口(在渲染器进程中),它启动多个后台服务。在这些后台服务成功启动后,它会发送 "services-running"在其ipcRenderer
Electron 新手我已经知道如何从渲染器发送到 Main,但我正在尝试学习如何从 Main 到渲染器。在我的研究中,我读到: IPC send from main process to rende
在 electron , 可以通过 ipcRenderer.sendSync('synchronous-message', 'ping') 将同步消息从 IpcRenderer 发送到 IpcMain
我正在使用 Electron、Vue + Vuetify 创建桌面应用程序,但是当我尝试使用 IPC 从 rendererProcess 向 mainProcess 发送内容时,会出现白屏和空白屏幕,
我是一名优秀的程序员,十分优秀!