0

我有一个使用反应的电子应用程序。我在 preload.js 中使用 contextBridge。我想将 app.js 中的变量通过桥传递给主进程中的函数;它将一个值返回到桥并返回到 app.js,它会以某种方式更新状态并触发重新渲染。以下代码正在工作到更新状态。我不明白如何从 preload.js 到 app.js 获取变量?我希望的临时技巧是从预加载中设置 localstorage 并调用 setTimeout 函数来观察特定变量的变化。我知道这是一种不太有趣的方法。代码在这里:

app.js -

async function createSpreadsheet() {
  let x = await electron.google.createSpreadsheetFiles(sheetFileName)
}

preload.js -

const { ipcRenderer, contextBridge, net } = require('electron');

contextBridge.exposeInMainWorld('electron', {
  google: {
    createSpreadsheetFiles(name) {
      ipcRenderer.send('gCreateSpreadSheetFile', name);
      let x = ipcRenderer.on('gCreateSpreadSheetFile-return', function (event, arg) {
      })
      return x
    },
  },
})

main.js -

  ipcMain.on('gCreateSpreadSheetFile', (event, name) => {
    async function all() {
      let resp = await g.createSheetFile(name, win)
      event.sender.send('gCreateSpreadSheetFile-return', resp)
    }
    all()
  })
4

2 回答 2

0

您可以使用 ipcRenderer 调用和 ipcMain 句柄:

preload.js

contextBridge.exposeInMainWorld('electron', {
  google: {
    createSpreadsheetFiles: (name) => ipcRenderer.invoke('gCreateSpreadSheetFile-invoke', name),
  },
});

main.js

ipcMain.handle('gCreateSpreadSheetFile-invoke', (event, name) => {
  return 'value';
});

renderer

window.electron.google.createSpreadsheetFiles(spreadSheetName).then((value) => {
  console.log(value);
});
// or
var value = await window.electron.google.createSpreadsheetFiles(spreadSheetName);

在文档上:https ://www.electronjs.org/docs/api/ipc-renderer#ipcrendererinvokechannel-args

于 2021-06-08T07:59:36.257 回答
0

好的,我很抱歉在答案部分发布另一个问题,我不明白如何在评论回复中格式化代码。

此代码仍然不会返回 app.js:

app.js    

const res = await electron.g.createSpreadsheetFiles(sheetFileName)
        console.log(res) // prints undefined, before code is excecuted

返回 res 而不等待 preload.js 的返回。这是来自 preload.js 的代码

preload.js    

g: {
        createSpreadsheetFiles(name) {
          (async () => {
            const result = await ipcRenderer.invoke('gCreateSpreadSheetFile-invoke',  name);
            return result; 
          })();
      }
于 2021-06-08T20:28:02.063 回答