为什么我的电子事件被延迟到渲染过程?

时间:2018-09-26 22:03:40

标签: express electron ipc lifecycle

我正在尝试打开电子应用程序中的拨动开关,以启动快递服务器,该服务器将消息发送回该服务器已开启的应用程序。

现在正在发生的事情是,将开关拨动,服务器已打开,但是该事件并未像应有的那样触发回渲染过程。

相反,我必须在浏览器中访问我的快速服务器路由之一,然后该路由将发送之前应该发送的日志以及路由请求随附的新日志。

index.js

const {app, BrowserWindow, ipcMain} = require('electron');

ipcMain.on('log', (event, arg) => {
  mainWindow.webContents.send('log', arg)
});

ipcMain.on('web-state', (event, current) => {
  current ? Web.turnOff() : Web.turnOn()
  event.sender.send('web-state', Web.isOn() ? true : false);
});

render.js

window.$ = window.jQuery = require('jquery');
const {ipcRenderer} = require('electron');

ipcRenderer.on('log', function(event , data) {
  console.log(data);
});

$('#web-switch').on('click', function(e) {
  var Server = !document.getElementById("web-switch").checked? Web.turnOff() : Web.turnOn();
});

server.js

const Express = require('express');
const Web = Express();
const Logger = require('./logger.js');
var Server;
let mainWindow;

function turnOn() {
  return Server = Web.listen(Config.web.port || 4000, function() {
    let str = 'App awakens on port ' + Config.web.port;
    Logger.log(str, t);
  });
}

module.exports = {
  turnOn: function() {
    return turnOn();
  },
  isOn: function() {
    return Server? Server.address() : false;
  }
}

logger.js

const {ipcRenderer} = require('electron');

function log(data, level) {
    let str = 'something';
    ipcRenderer.send('log', str);
}

module.exports = {
    log: function(data, level) {
       log(data,level)
    }
}

index.html

require('../js/render.js');
<input type="checkbox" id="web-switch" name="web-switch">

2 个答案:

答案 0 :(得分:0)

我通过在turnOn()中编辑server.js函数来修复它

function turnOn() {
  Server = Web.listen(Config.web.port || 4000);
  let str = 'App awakens on port ' + Config.web.port;
  Logger.log(str, t);
  return Server;
}

最好的答案将交给谁能解释为什么我在回调函数中进行日志调用时会有这样的延迟

答案 1 :(得分:0)

我遇到了类似的问题,即只有在重新调整渲染器窗口的焦点之后,第一次初始化事件才会出现延迟。

使用did-finish-load事件解决了该问题:

win.webContents.on('did-finish-load', () => {
  // make sure to initialize your events/server here
  win.webContents.send('ping', 'whoooooooh!')
})