【问题标题】:fs.readdir inside ipcMain.handle does not returnipcMain.handle 中的 fs.readdir 不返回
【发布时间】:2021-05-27 05:22:37
【问题描述】:

它总是返回未定义,请问有什么想法吗? 我需要在 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]
})

【问题讨论】:

    标签: javascript node.js electron readfile ipcmain


    【解决方案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]);
              })
         });
    });
    

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

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

    【讨论】:

      【解决方案2】:

      来自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/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
        }
      })();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        相关资源
        最近更新 更多