fs.readdir里面ipcMain.handle没有return

fs.readdir inside ipcMain.handle does not return

它总是return未定义,有什么想法吗? 我需要 fs.reddir 里面的 return 但相对于 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]
})

您需要使用 event.sender.send 触发从 mainrenderer 进程的另一个调用到 return 结果,最后一个将使用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]);
          })
     });
});

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

编辑:通常在使用 ipcRenderer.send 发送 renderer 调用并使用 ipcMain.onmain 进程上接收它时使用此技术。

来自 ipcMain.handle(channel, listener) 文档:

If listener returns a Promise, the eventual result of the promise will be returned as a reply to the remote caller. Otherwise, the return value of the listener will be used as the value of the reply.

// 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/awaitfs.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
  }
})();

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