使用PhantomJS迭代ID并为每个ID生成报告pdf

时间:2015-06-08 15:07:41

标签: javascript phantomjs

此代码为第一个员工生成一个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);

});

1 个答案:

答案 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