使用CasperJS正确迭代数组和打开页面

时间:2015-06-27 17:49:14

标签: javascript jquery arrays casperjs

我正在与CasperJS合作开展一个小项目。主要想法是从某些网站的子页面获取带有标题和描述的图片的链接。我已经尝试了很多不同的方法来实现我想要的东西,但是我仍然坚持使用一些代码,我不想继续使用可能不正确的编码方式。

这是我代码中的当前事件序列:

casper.start(url);
casper.thenEvaluate(openPicturesSubpage);
casper.then(getPicturesInfo);
casper.then(getPictureFullRes);
casper.run();

前两个命令按预期工作,所以我将跳到第三个函数的结构。函数代码(我使用的是jQuery,因为我需要在其他函数中获取一些特定的东西)getPicturesInfo(变量pictures是全局的):

getPicturesInfo = function() {
  pictures = this.evaluate(function() {
    var array = [];
    $('.picture-box a').each(function() {
      arr.push({
        'name': $(this).text(),
        'subpage': $(this).attr('href')
      });
    });
    return array;
  });
}

基本上我拥有继续“浏览”实际全分辨率图片链接所需的一切。因此,下一步是将新数据附加到已创建的数组。这也是我想解决的主要问题。如何正确迭代以前保存的数据数组?所以有最后一个函数getPictureFullRes的代码:

getPictureFullRes = function() {
  for (var i = 0; i < pictures.length; i++) {
    this.thenOpen(pictures[i]['subpage'], getFullResLink);
  }
}

问题在于我无法将计数器变量i传递给我的函数getFullResLink。我还尝试向thisOpen函数添加getFullResLink方法和参数的另一个参数,但它不起作用,因为方法没有该功能。

如何在getFullResLink内访问相应的数组索引?

1 个答案:

答案 0 :(得分:2)

我认为有两种方法可以解决这个问题。

使用闭包

像这样定义getFullResLinkWrapper

function getFullResLinkWrapper(pictureIndex){
    return function(){
        // contents of getFullResLink that uses `pictureIndex`
    };
}

然后你可以这样称呼它:

this.thenOpen(pictures[i]['subpage'], getFullResLinkWrapper(i));

这样,您可以为每个getFullResLink的迭代包含索引变量。

计算函数内部

保证在执行CasperJS期间不会跳过then()个步骤。因此,您可以轻松地推进getFullResLink函数内的计数器:

function getFullResLink(){
    if (pictureIndex == null) {
        pictureIndex = 0;
    } else {
        pictureIndex++;
    }
    ...
}