javascript - PNG 未使用 PhantomJS 在循环中多次尝试进行渲染

标签 javascript for-loop phantomjs

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。但是,使用当前代码不会生成它。

问题2:添加注释掉的if block 会导致代码执行卡住。为什么会这样?

最佳答案

您遇到了三个相互交织的问题。

1。 继续

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);

关于javascript - PNG 未使用 PhantomJS 在循环中多次尝试进行渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31621577/

相关文章:

javascript - 隐藏后如何保留 bootstrap popover 的内容,或者如何真正隐藏它

javascript - For循环数组设置元素等于一个变量

Javascript - 方法链上的缩进会导致分号问题吗?

javascript - jstree 对从右到左语言的支持不起作用

php - 生成每个月的标题,按月排序

Bash for 带空格的循环

c# - 如何在 phantomjsdriver selenium c# 中启用 cookie?

javascript - Phantomjs page.content 未检索页面内容

javascript - 如何更改 casper.js 中的全局变量

javascript - javascript中的正则表达式/斜杠是什么意思