Javascript 在主渲染器和渲染器之间加载html后获取消息时出现问题
我正在构建一个电子应用程序,我遇到了以下问题。 我用一个设备的插座获取信息,它工作正常。如果程序获得一种消息类型,我想更改页面的html,所以基本上我使用了loadUrl方法,但是在向渲染器进程发送消息之后,我似乎没有收到消息 我的代码:Javascript 在主渲染器和渲染器之间加载html后获取消息时出现问题,javascript,electron,Javascript,Electron,我正在构建一个电子应用程序,我遇到了以下问题。 我用一个设备的插座获取信息,它工作正常。如果程序获得一种消息类型,我想更改页面的html,所以基本上我使用了loadUrl方法,但是在向渲染器进程发送消息之后,我似乎没有收到消息 我的代码: photoViewOn = false; ... app.on('ready', function(){ // Create new window mainWindow = new BrowserWindow({ backgroun
photoViewOn = false;
...
app.on('ready', function(){
// Create new window
mainWindow = new BrowserWindow({
backgroundColor: '#000000',
fullscreen : true,
frame : false,
icon : __dirname + "/res/logo.png",
webPreferences: {
nodeIntegration : true
}
});
mainWindow.webContents.openDevTools();
// Load html in window
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'bigNames.html'),
protocol: 'file:',
slashes:true,
}))...)
function HTMLupdate(msg) {
mainWindow && mainWindow.webContents.send('update', msg);
var server = socketBuilder('localhost', '7777', {
message: (msg, rinfo) => {
try {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
var infoMap = processCyrano(msg);
//if (infoMap["Com"] === "")
if (infoMap != null) {
if (infoMap["Com"] === "INFO") {
if (photoViewOn) {
photoViewOn = false;
bigNamesView();
}
console.log("Inside Infomap");
console.log(`Left Fencer: ${infoMap["LeftName"]}`);
console.log(`Right Fencer: ${infoMap["RightName"]}`);
HTMLupdate(infoMap);
}
}
}
catch (error) {
console.log(`Error ${error}`);
}
},
error: (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
},
listen: () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
}
});
function photoView() {
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'photos.html'),
protocol: 'file:',
slashes:true,
}));
}
function bigNamesView() {
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'bigNames.html'),
protocol: 'file:',
slashes:true,
}));
}
function processCyrano(msg) {
try {
let stripMsg = msg.toString().split("%");
let info = {};
let compInfo = stripMsg[0].split("|");
console.log(compInfo);
if(compInfo[2] === "INFO" || compInfo[2] === "DISP") {
let firstFencerInfo = stripMsg[1].split("|")
let secondFencerInfo = stripMsg[2].split("|")
info.Protocol = compInfo[1];
info.Com = compInfo[2]
info.Piste = compInfo[3]
info.Compe = compInfo[4];
info.Phase = compInfo[5];
info.PoulTab = compInfo[6];
info.Match = compInfo[7];
info.Round = compInfo[8];
info.RightId = firstFencerInfo[1];
info.RightName = firstFencerInfo[2];
info.RightNat = firstFencerInfo[3];
info.Rscore = firstFencerInfo[4];
info.Rstatus = firstFencerInfo[5];
info.RYcard = firstFencerInfo[6];
info.Rrcard = firstFencerInfo[7];
info.Rlight = firstFencerInfo[8];
info.RWlight = firstFencerInfo[9];
info.LeftId = secondFencerInfo[1];
info.LeftName = secondFencerInfo[2];
info.LeftNat = secondFencerInfo[3];
info.Lscore = secondFencerInfo[4];
info.Lstatus = secondFencerInfo[5];
info.LYcard = secondFencerInfo[6];
info.Lrcard = secondFencerInfo[7];
info.Llight = secondFencerInfo[8];
info.LWlight = secondFencerInfo[9];
lastMatch = info;
return info;
}
else if (compInfo[2] === "PHOTO-NEXT") {
console.log("Photo-Next received");
photoViewOn = true;
photoView();
}
else if (compInfo[2] === "PHOTO-SCORE") {
console.log("Photo-score received");
photoViewOn = true;
photoView();
}
else if (compInfo[2] === "PHOTO-STOP") {
console.log("Photo-Stop received");
return lastMatch;
}
return null;
}
catch (error) {
//Avoid empty messages of the protocol
console.log(`Error ${error}`);
return null;
}
}
基本上,我的尝试是,如果我收到一条“Photo Score”消息,调用photoView()(这很好),如果收到“Photo Stop”,则调用bigNamesView()并开始使用HTMLUpdate(msg)发送信息,但这对我不起作用。你知道为什么会这样吗?
注意,我删除了一些不相关的代码。谢谢。嗨,我的朋友,你的问题是
lastMatch=info
只发生在内部
if(compInfo[2]==“INFO”| | compInfo[2]==“DISP”){
因此,只有当收到“照片停止”
时,您才返回lastMatch
在代码内部,只有当我们收到
INFO
call bigNamesView()时,您的逻辑才会显示
但您只想在我们收到PHOTO-STOP
call bigNamesView()时使用
关于loadurl方法您可以调用main window.webContents.send('update',msg);
在HTMLupdate中立即等待事件加载完成,然后调用send update msg
win.webContents.on('did-finish-load', () => {
HTMLupdate(infoMap);
})
嗨,我的朋友,你的问题是,
lastMatch=info
只发生在内部
if(compInfo[2]==“INFO”| | compInfo[2]==“DISP”){
因此,只有当收到“照片停止”
时,您才返回lastMatch
在代码内部,只有当我们收到
INFO
call bigNamesView()时,您的逻辑才会显示
但您只想在我们收到PHOTO-STOP
call bigNamesView()时使用
关于loadurl方法您可以调用main window.webContents.send('update',msg);
在HTMLupdate中立即等待事件加载完成,然后调用send update msg
win.webContents.on('did-finish-load', () => {
HTMLupdate(infoMap);
})
在您的服务器中,您具有该条件
if (photoViewOn) {bigNamesView()}
但在函数processCyrano中,“PHOTO-STOP”的条件不会将photoViewOn设置为true
else if (compInfo[2] === "PHOTO-STOP") {
console.log("Photo-Stop received");
return lastMatch;
}
改为
else if (compInfo[2] === "PHOTO-STOP") {
console.log("Photo-Stop received");
photoViewOn = true;
return lastMatch;
}
在您的服务器中,您具有该条件
if (photoViewOn) {bigNamesView()}
但在函数processCyrano中,“PHOTO-STOP”的条件不会将photoViewOn设置为true
else if (compInfo[2] === "PHOTO-STOP") {
console.log("Photo-Stop received");
return lastMatch;
}
改为
else if (compInfo[2] === "PHOTO-STOP") {
console.log("Photo-Stop received");
photoViewOn = true;
return lastMatch;
}
感谢您的回复。这与其说是一个实际答案,不如说是一个评论。另外,我认为这与我关于loadUrl()为什么要更改主进程和呈现进程之间的连接的问题无关。感谢您的回复。这与其说是一个实际答案,不如说是一个评论。此外,我认为这与我关于loadUrl()为什么的问题无关正在更改主进程和渲染进程之间的连接。您好,您是否再次检查我的答案?我是在第二天编辑的您好,您是否再次检查我的答案?我是在第二天编辑的