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
用于转到循环结构的下一次迭代,例如 for
或 while
。那不是你在这里做的事。在本地范围内没有围绕 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/