如何在Electron JS中每次循环迭代时从主进程接收数据?

hgb9j2n6  于 2023-05-27  发布在  Electron
关注(0)|答案(1)|浏览(175)

晚上好!你能告诉我如何在循环中的每次迭代中从主进程获取数据到渲染进程,以便向用户显示该进程吗?谢谢!

main.js

ipcMain.handle('get-some-backend-data', (event) => {
  for (let i = 0; i < 3; i++) {
    return(i);
  }
});

preload.js

getSomeBackendData: () => ipcRenderer.invoke('get-some-backend-data')

renderer.js

async function handleGetSomeBackendData() {
    try {
      let result = await window.electron.ipcRenderer.getSomeBackendData(
        'get-some-backend-data'
      );
      console.log(result); // i need get (0,1,2), but i have got 0, of course
    } catch (error) {
      console.error(error);
    }
  }
cbjzeqam

cbjzeqam1#

如果你的目标是从ipcMain.handle返回一个数组,那么你应该从每次迭代中收集数据,并在完成后返回整个数组。
main.js

ipcMain.handle('get-some-backend-data', (event) => {
  const result = [];

  for (let i = 0; i < 3; i++) {
    result.push(i);
  }

  return result;
});

renderer.js

async function handleGetSomeBackendData() {
  try {
    let result = await window.electron.ipcRenderer.getSomeBackendData(
      'get-some-backend-data'
    );
    console.log(result); // should now log [0, 1, 2]
  } catch (error) {
    console.error(error);
  }
}

如果这不是您想要的,您需要共享更多的ipcMain处理程序代码,以显示您在该循环中所做的事情。
详细说明这个问题:这不是电子特有的。如果你从任何一个常规JS函数的循环中返回,整个函数将返回return语句的参数,然后完成(大多数其他主流语言也是如此)。
也就是说,JavaScript支持挂起函数执行,可选地返回一个结果,并能够在稍后执行(并可能返回另一个结果)。这是使用生成器函数完成的,参见function*。然而,它们是非常具体的,通常不是你想要或需要的。

相关问题