【问题标题】:Retry loading a webpage when failed in electron电子失败时重试加载网页
【发布时间】:2016-03-09 01:24:53
【问题描述】:

我正在使用电子显示一些网页。以下是我的编码:

var app = require('app');
var ipc = require('ipc');
var BrowserWindow = require('browser-window');
var settings = require('./settings');

var mainWindow = null;

app.on('window-all-closed', function() {
  if (process.platform != 'darwin') {
    app.quit();
  }
});

app.on('ready', function(){
    var mainWindow = new BrowserWindow({
        fullscreen: true,
        autoHideMenuBar: true
     })

     mainWindow.loadUrl('file://' + __dirname + '/index.html') // FIRST WEBPAGE

    mainWindow.on('closed', function() {
    mainWindow = null;
    });

ipc.on('redirect', function(){
    mainWindow.loadUrl('http://192.168.1.10/page2')  // SECOND WEBPAGE

    mainWindow.webContents.on("did-fail-load", function() {
        console.log("did-fail-load");

        mainWindow.loadUrl('file://' + __dirname + '/index.html');   
 // REDIRECT TO FIRST WEBPAGE AGAIN
    });

});

它将首先进入第一个网页,然后在使用 ipc 模块从 javascript 收到“重定向”命令后,它将重定向到第二个网页。但是我需要检查第二个网页是否可以连接。如果无法连接(did-fail-load),它会再次转到第一个网页。并且循环继续。

我使用 console.log("did-fail-load") 来检查它是否无法连接到第二页。但我发现它重复了通话。第一次连接第二个网页失败,出现一个console.log("did-fail-load"),第二次重试时出现两个console.log("did-fail-load") ,第三次重试时,出现三个console.log("did-fail-load")。是不是在 mainWindow 上出现了重复调用?

当电子失败时重试加载网页的最佳方法是什么?

【问题讨论】:

  • mainWindow.loadUrl('file://' + __dirname + '/index.html') 为我工作

标签: javascript html ipc webpage electron


【解决方案1】:

这是一篇旧帖子,但我觉得这个问题从未真正为 OP 回答过。

您会看到多个 console.log 消息,因为每次重定向发生时都会添加一个新的 did-fail-load 回调。您只需在ipc.on('redirect') 回调之外添加一次回调。示例:

app.on('ready', function(){
  var mainWindow = new BrowserWindow({
    fullscreen: true,
    autoHideMenuBar: true
  })

  mainWindow.loadUrl('file://' + __dirname + '/index.html') // FIRST WEBPAGE

  mainWindow.on('closed', function() {
    mainWindow = null;
  });

  /* Set did-fail-load listener once */
  mainWindow.webContents.on("did-fail-load", function() {
    console.log("did-fail-load");

    mainWindow.loadUrl('file://' + __dirname + '/index.html');
  });
});

/* This is called every time a redirect occurs, 
 * so don't add any listeners here. Only add code
 * to handle the redirect
 */
ipc.on('redirect', function(){
  mainWindow.loadUrl('http://192.168.1.10/page2')  // SECOND WEBPAGE
});

【讨论】:

    【解决方案2】:

    您必须问自己一个问题:“为什么加载失败?”和“现在会加载吗?”

    “为什么”定义了如何检查您的网页是否会加载的最佳方式。当您在加载之前检查 url/server 时,请确保它可以加载。这样就不需要重新加载了。

    根据您的代码,我猜您想检查网络中的服务器是否正在运行。 为此,您可以使用节点模块 node-net-ping https://github.com/stephenwvickers/node-net-ping

    在你的应用中通过 npm 安装模块:

    npm install node-net-ping --save
    

    通过 require 将模块加载到顶部:

    var ping = require ("net-ping");
    

    检查他们的服务器是否可用:

    var session = ping.createSession ();
    
    session.pingHost ('192.168.1.10', function (error, target) {
        if (!error)
            // Load second page
    });
    

    另一个可能更好的解决方案是在加载 url 之前检查请求。这也是通过电子的 node.js 部分完成的。答案从这里复制: Node.js - How to check status of a URL within a http request

    var request = require('request'); 
    request('http://www.google.com', function (error, response, body) {
        if (!error && response.statusCode == 200) {
          console.log("URL is OK") 
          // Load second page
        }
    

    取决于“为什么加载失败?”的答案。您应该创建支票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多