此代码为第一个员工生成一个pdf,其ID在url地址中。我想迭代许多ID并为每个具有唯一ID的员工生成几个pdf。
员工的记录是一个CSV文件,已在其他地方读取和解析。同样,为了迭代id,我创建了一个包含id的数组,称为idArray
。 (例如idArray = ['123', '127', '156']
)。你能帮我从idArray
创建一个每个id的pdf吗?
var page = require('webpage').create(),
system = require('system'),
id = system.args[1];
page.open('http://127.0.0.1:3000/report.html?id=' + id, function () {
var intervalHandle;
// poll until
var ready = function () {
var ready = page.evaluate(function () {
return reportReady;
});
if (ready) {
clearInterval(intervalHandle);
page.render('report-id.pdf');
phantom.exit();
} else {
console.log("Not ready yet");
}
};
intervalHandle = setInterval(ready, 100);
});
答案 0 :(得分:1)
问题在于您不能简单地迭代 ID。 page.open()
是异步的,因此您可以告诉PhantomJS在上一个ID完成加载之前加载具有下一个ID的页面。
解决方案是使用递归。定义一个函数,该函数包含执行一次迭代的逻辑,并使用它来将多个回调串起来:
var page = require('webpage').create(),
system = require('system'),
idArray = system.args[1].split(",");
iterate(); // let it run
function iterate() {
var id = idArray.shift(); // changes the idArray
page.open('http://127.0.0.1:3000/report.html?id=' + id, function () {
var intervalHandle;
// poll until
var ready = function () {
var ready = page.evaluate(function () {
return reportReady;
});
if (ready) {
clearInterval(intervalHandle);
page.render('report-id.pdf');
if (idArray.length > 0) {
iterate();
} else {
phantom.exit();
}
} else {
console.log("Not ready yet");
}
};
intervalHandle = setInterval(ready, 100);
});
}
我假设ID以这种方式传递:
$ phantomjs script.js 4,8,15,16,23,42