我很难通过上下文桥将Electron文档中的Invoke方法应用到我的项目中。
在renderer.js
中,我需要触发main.js
中的异步函数,并等待renderer.js
中的响应。
我下面的代码成功触发了main.js
中的一个动作。但是,renderer.js
中的响应是**undefined
**。
我尝试了几种不同的修改,但它越来越糟。请指出我在这里做错了什么!preload.js
contextBridge.exposeInMainWorld(
"api", {
doInvoke: (channel, func) => {
let validChannels = ["some-channel"];
if (validChannels.includes(channel)) {
ipcRenderer.invoke(channel, data).then((result) => {return result})
}
},
}
);
renderer.js
$(document).on('keyup','input', async function(e){
let response = await window.api.doInvoke(channel='some-channel', data='test-string')
console.log(response) //--> logs undefined
})
main.js
ipcMain.handle('some-channel', async (event, data) => {
const result = await doSomeWork(data)
return result
})
async function doSomeWork(data){
console.log(data) //--> logs 'test-string'
return data + 's'
}
1条答案
按热度按时间oug3syen1#
虽然有许多小问题可以优化,但主要问题是无法正确地将结果从
preload.js
脚本返回到index.html
(renderer.js
)文件。下面是一个最小可重复的示例。
您的
main.js
文件几乎是完美的。也就是说,如果将doSomeWork
分配给result
然后返回它,则直接返回它。main.js
(主进程)你的
preload.js
脚本是正确的。不是从.then
语句中返回,而是返回invoke
函数。这就是问题所在。preload.js
(主流程)对于
index.html
文件,由于ipcRenderer.invoke(channel,...args)返回一个promise,因此不需要使用async/await
。相反,只需使用.then
语句来处理promise响应。另外,不要在函数定义中分配
channel
和data
变量。相反,参数可以只是值。index.html
(渲染过程)