Javascript Can';t将数组项传递给PhantomJS中的函数

Javascript Can';t将数组项传递给PhantomJS中的函数,javascript,arrays,phantomjs,Javascript,Arrays,Phantomjs,我正试图把源代码拉到几个网页一次。链接通过源文本文件输入到数组中。我能够遍历数组并打印出链接并确认它们在那里,但是当试图通过函数传递它们时,它们在第一次迭代后变得未定义 我的最终目标是让它将每个页面的源代码保存到自己的文档中。它正确地执行第一页,但后续尝试未定义。我已经找了几个小时了,但如果有人能给我指出正确的方向,我将不胜感激 var fs = require('fs'); var pageContent = fs.read('input.txt'); var arrdata = pageCo

我正试图把源代码拉到几个网页一次。链接通过源文本文件输入到数组中。我能够遍历数组并打印出链接并确认它们在那里,但是当试图通过函数传递它们时,它们在第一次迭代后变得未定义

我的最终目标是让它将每个页面的源代码保存到自己的文档中。它正确地执行第一页,但后续尝试未定义。我已经找了几个小时了,但如果有人能给我指出正确的方向,我将不胜感激

var fs = require('fs');
var pageContent = fs.read('input.txt');
var arrdata = pageContent.split(/[\n]/);
var system = require('system');
var page = require('webpage').create();
var args = system.args;
var imagelink;
var content = " ";

function handle_page(file, imagelink){
    page.open(file,function(){
        var js = page.evaluate(function (){
            return document;
        });
        fs.write(imagelink, page.content, 'w');
        setTimeout(next_page(),500);
    });
}
function next_page(imagelink){
    var file = imagelink;
    if(!file){phantom.exit(0);}
    handle_page(file, imagelink);
}

for(var i in arrdata){
    next_page(arrdata[i]);
}

我现在意识到,如果让for循环只迭代一次,那么其他两个函数将创建自己的循环,这是有意义的,但在运行时仍然存在问题。

PhantomJS的
page.open()
是异步的(这就是为什么会有回调)。另一件事是
page.open()
是一个很长的操作。如果进行了两次这样的调用,则第二次调用将覆盖第一次调用,因为您在同一
页面上操作

最好的方法是使用递归:

function handle_page(i){
    if (arrdata.length === i) {
        phantom.exit();
        return;
    }
    var imageLink = arrdata[i];
    page.open(imageLink, function(){
        fs.write("file_"+i+".html", page.content, 'w');
        handle_page(i+1);
    });
}
handle_page(0);
还有两件事:

  • setTimeout(下一页(),500)
    立即调用
    下一页()
    ,无需等待。你想要设置超时(下一页,500),但它也不起作用,因为如果没有参数
    下一页
    就会退出
  • fs.write(imagelink,page.content,'w')
    imagelink
    可能是一个URL,在这种情况下,您可能需要定义另一种设计文件名的方法
  • 虽然
    for(arrdata中的var i){next_page(arrdata[i]);}
    在这里起作用,但请注意,这并不适用于所有数组和类似数组的对象。对循环使用dumb,如
    for(var i=0;i
    array.forEach(function(item,index){…})
    (如果可用)
  • page.evaluate()。在将其从
    evaluate()
    中传递出去之前,您必须将其转换为可序列化的格式