Проблема с получением сообщений после загрузки html между основным и рендерером - PullRequest
1 голос
/ 29 января 2020

Я создаю приложение Electron и застрял со следующей проблемой. Я получаю информацию, используя разъем от устройства, и он работал нормально. Я хотел изменить html страницы, если программа получает тип сообщения, поэтому в основном я использовал метод loadUrl, но затем, после отправки сообщения процессу рендерера, мне кажется, что оно не получено.

Мой код:

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), но у меня это не работает. Любая подсказка, почему это происходит? Обратите внимание, что я удалил какой-то нерелевантный код. Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

На вашем сервере у вас есть условие

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;
    }
0 голосов
/ 02 февраля 2020

привет, мой друг, у тебя проблема в том, что lastMatch = info происходит только внутри

if(compInfo[2] === "INFO" || compInfo[2] === "DISP") {

Так что только при получении "Photo-Stop" возвращаешь lastMatch
.

внутри кода вашей логики c говорит только тогда, когда мы получаем INFO вызов bigGamesView ()

, но вы хотите, только когда мы получаем PHOTO-STOP вызов bigNamesView ()

.

Также о методе loadurl , который вы вызываете mainWindow.webContents.send('update', msg); в HTMLupdate, сразу следует дождаться события did-fini sh -load, затем вызвать обновление отправки сообщения msg

win.webContents.on('did-finish-load', () => {
    HTMLupdate(infoMap);
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...