1

它总是返回未定义,请问有什么想法吗?我需要 fs.reddir 内的返回,但相对于 ipcMain

//main

ipcMain.handle('pegaDirRomSalvo', async (event, argx=0) => {
  fs.readFile('dataCR.txt', 'utf8', function (err,data) {

    if (err) {return '0'}
    fs.readdir(data, (err, files) => {
          if (err) {throw err;}
          return [data,files] //<-------- not going
    })
   
  })
})


//render

ipcRenderer.invoke('pegaDirRomSalvo',a=0).then((result)=>{
         document.getElementById('divCaminho').innerText = result[0]
})
4

2 回答 2

1

您需要使用event.sender.send触发从mainrenderer进程的另一个调用以返回结果,最后一个将使用ipcRenderer.on. 这是一个示例解决方案:

渲染器:

const { ipcRenderer } = require('electron');
ipcRenderer.invoke('pegaDirRomSalvo', a=0);
ipcRenderer.on('FILES_LIST_FETCHED', (event, result) => {
     console.log(result);
     document.getElementById('divCaminho').innerText = result[0]
});

主要的:

const { ipcMain } = require('electron');
ipcMain.handle('pegaDirRomSalvo', async (event, argx=0) => {
     fs.readFile('dataCR.txt', 'utf8', function (err,data) {
          if (err) { return '0'; }
          fs.readdir(data, (err, files) => {
               if (err) {throw err;}
               event.sender.send('FILES_LIST_FETCHED', [data, files]);
          })
     });
});

如果需要,您可以执行相同的操作来返回错误详细信息。

编辑:此技术通常在使用发送renderer呼叫ipcRenderer.send并在main使用ipcMain.on.

于 2021-02-24T21:13:00.683 回答
0

ipcMain.handle(channel, listener)文档:

如果侦听器返回一个 Promise,则该 Promise 的最终结果将作为对远程调用者的回复返回。否则,监听器的返回值将作为回复的值。

// main
ipcMain.handle("pegaDirRomSalvo", (event, argx = 0) => {
  return new Promise((resolve, reject) => {
    fs.readFile("dataCR.txt", "utf8", function (err, data) {
      if (err) {
        reject(err);
        return;
      }
      fs.readdir(data, (err, files) => {
        if (err) {
          reject(err);
          return;
        }
        resolve([data, files]);
      });
    });
  });
});

// render
ipcRenderer.invoke("pegaDirRomSalvo", (a = 0)).then((result) => {
  document.getElementById("divCaminho").innerText = result[0];
});

代码可以使用重构async/await并且fs.promises更具可读性

// main
const fsPromisified = require("fs/promises");

ipcMain.handle("pegaDirRomSalvo", async () => {
  const data = await fsPromisified.readFile("dataCR.txt", "utf-8");
  const files = await fsPromisified.readdir(data);
  return [data, files];
});

// render
(async () => {
  try {
    const result = await ipcRenderer.invoke("pegaDirRomSalvo");
    document.getElementById("divCaminho").innerText = result[0];
  } catch (err) {
    // handle errors
  }
})();

或者你可以在主进程中处理错误

于 2021-02-25T07:44:51.080 回答