当Electron加载网页失败时,如何重试加载?

4

我正在使用electron来显示一些网页。以下是我的代码:

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上调用了重复的调用?
在electron中,重新加载网页的最佳方法是什么?

mainWindow.loadUrl('file://' + __dirname + '/index.html') 对我有效。 - Chandler Bing
2个回答

5

这是一篇旧帖子,但我觉得问题实际上从未被回答。

您会看到多个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之前检查请求。这也是使用Electron的node.js部分完成的。答案来自这里: Node.js - 如何在http请求中检查URL的状态

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
    }

根据“为什么负载失败?”的答案,您应该创建检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接