electron 电子-如何共享一个单一的承诺决议从主要到多个渲染器?

vcudknz3  于 2023-03-16  发布在  Electron
关注(0)|答案(1)|浏览(154)

我是电子的新手,正试图找出处理共享对象的最佳方法。
本质上,我想在Main进程中初始化某个东西,然后在多个渲染器进程中使用它,如下所示:

// main.js
const node = rosnodejs.initNode(); // returns a promise

// renderer1.js
node.then((nh) => {
  nh.subscribe("topic1");
})

// renderer2.js
node.then((nh) => {
  nh.subscribe("topic2");
})

我可以使用remote共享node,但是nh.subscribe在我的渲染器中变成了一个匿名函数并且失败了。

// main.js
global.node = rosnodejs.initNode(); // returns a promise
global.node.then((nh) => {
  nh.subscribe("topic1");  // WORKS PERFECTLY!
})

// renderer1.js
const remote = require('electron').remote;
const node = remote.getGlobal('node');
node.then((nh) => {
  nh.subscribe("topic2"); // FAILS MISERABLY.
})

故障消息为Error: Could not call remote function 'subscribe'. Check that the function signature is correct. Underlying error: type.datatype is not a function
有没有合适的方法来处理这个问题?我应该使用ipcMain/ipcRenderer来代替吗?

x3naxklr

x3naxklr1#

如果有人碰巧碰到这个(相当古老的)问题,你可以这么做。Remote已经过时了,而且被认为是不安全的,所以你应该使用IPC消息,只需等待一个监听来自呈现器的响应的承诺。所以在主进程中它可以是一个看起来像这样的函数。

async sendToRendererAndWaitForAnswer<T>(
    yourData: unknown,
    timeout: number,
  ): Promise<T> {
    this.mainWindow.webContents.send('to-renderer-message', yourData)
    return new Promise((resolve, reject) => {
      const listener: ElectronListener = (event, { response }) => {
        ipcMain.removeListener('to-main-message', listener)
        resolve(response)
      }
      setTimeout(() => {
        ipcMain.removeListener('to-main-message', listener)
        reject(new Error('Timeout reached waiting for message'))
      }, timeout)
      ipcMain.on('to-main-message', listener)
    })
  }

相关问题