PNG 未使用 PhantomJS 在循环中多次尝试渲染

PNG is not being rendered using PhantomJS with multiple attempts in a loop

var page = require('webpage').create();
var filepath = "/home/abc/" + "abc.html"; //create path to charts.html    
for (i = 0; i < 3; i++) { // make three attempts
    console.log("hi")
    page.open(filepath, function(status) {
      console.log(status);
      //if(status !== 'success') { //if not success, make another attempt
//        continue;
  //    }

      page.render('abc.png');
      phantom.exit();
    });
}    
phantom.exit();

运行 代码如下:

$ phantomjs hello.js

Q1:我希望在我的主目录中生成 abc.png。但是,使用当前代码不会生成它。

Q2: 加注解的if block back导致代码执行卡住。为什么会这样?

你的三个问题是交织在一起的。

1。 continue

continue 用于转到循环结构的下一次迭代,例如 forwhile。那不是你在这里做的。在本地范围内没有围绕 continue 的循环,这意味着这是一个语法错误。

PhantomJS 2 中存在一个错误,它不再显示语法错误并且只是冻结。 运行 你最喜欢的 linter(jslint、jshint、eslint)来防止此类错误。

2。 page.open() 是异步的

您不能使用循环一个接一个地打开多个页面。 page.open() 是异步的。通过调用它,您只需启动加载。由于它不会在下一次迭代中阻塞,您将用新的 URL 覆盖请求并且第一个请求将永远不会完成,因为 for 循环比页面请求快得多。

唯一可能加载的页面是最后一页,但是...

3。提前退出

你退出得太早了。由于 page.open() 是异步的,因此循环将 运行 完全完成,甚至不会完全加载一页。最后你有一个 phantom.exit() 将立即退出 PhantomJS。


如果您必须打开一堆页面,请使用递归方法或巧妙地使用 setTimeout()。您还可以使用 async's series() 函数以更理智的方式编写它。

作为简单递归函数的示例:

var page = require('webpage').create();
var filepath = "/home/abc/" + "abc.html"; //create path to charts.html    
function run(i){
    if (i <= 0) {
      return phantom.exit();
    }
    page.open(filepath, function(status) {
      console.log(status);
      if(status === 'success') { //if not success, make another attempt
        page.render('abc'+i+'.png');
      }
      run(i-1);
    });
}
run(3);