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
触发从 main
到 renderer
进程的另一个调用到 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.on
在 main
进程上接收它时使用此技术。
来自 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/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
}
})();
或者你可以在主进程中处理错误
它总是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
触发从 main
到 renderer
进程的另一个调用到 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.on
在 main
进程上接收它时使用此技术。
来自 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/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
}
})();
或者你可以在主进程中处理错误