Javascript ipcMain.handle内的fs.readdir不返回
它总是返回未定义的,有什么想法吗? 我需要在fs.reddir中返回,但要相对于ipcMainJavascript ipcMain.handle内的fs.readdir不返回,javascript,node.js,electron,readfile,ipcmain,Javascript,Node.js,Electron,Readfile,Ipcmain,它总是返回未定义的,有什么想法吗? 我需要在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) => {
//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]
})
//main
ipcMain.handle('pegaDirRomSalvo',异步(事件,argx=0)=>{
fs.readFile('dataCR.txt','utf8',函数(err,data){
if(err){返回'0'}
fs.readdir(数据,(错误,文件)=>{
if(err){throw err;}
返回[数据、文件]//{
document.getElementById('divCaminho')。innerText=result[0]
})
您需要使用event.sender.send
触发另一个调用,从main
调用呈现程序
返回结果,最后一个将使用ipcrederer.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]);
})
});
});
main:
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]);
})
});
});
如果需要,您也可以返回错误详细信息
编辑:此技术通常在使用ipcrender发送renderer
调用时使用。使用ipcMain发送main
并在main
进程上接收。在
文档中:
如果侦听器返回承诺,承诺的最终结果将作为对远程调用方的答复返回。否则,侦听器的返回值将用作答复的值
//main
ipcMain.handle(“pegaDirRomSalvo”,(事件,argx=0)=>{
返回新承诺((解决、拒绝)=>{
readFile(“dataCR.txt”,“utf8”,函数(err,data){
如果(错误){
拒绝(错误);
返回;
}
fs.readdir(数据,(错误,文件)=>{
如果(错误){
拒绝(错误);
返回;
}
解析([数据、文件]);
});
});
});
});
//渲染
ipcRenderer.invoke(“pegaDirRomSalvo”,(a=0))。然后((结果)=>{
document.getElementById(“divCaminho”).innerText=result[0];
});
可以使用async/await
和fs对代码进行重构。承诺
更具可读性
//main
const fsPromisified=要求(“fs/承诺”);
handle(“pegaDirRomSalvo”,异步()=>{
const data=wait fsPromisified.readFile(“dataCR.txt”、“utf-8”);
const files=wait fsPromisified.readdir(数据);
返回[数据、文件];
});
//渲染
(异步()=>{
试一试{
const result=await ipcdrenderer.invoke(“pegaDirRomSalvo”);
document.getElementById(“divCaminho”).innerText=result[0];
}捕捉(错误){
//处理错误
}
})();
也可以在主进程中处理错误