使用 CasperJS 正确地遍历数组和打开页面

Correctly iterating through array and open pages with 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;
  });
}

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

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

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

如何访问 getFullResLink 中适当的数组索引?

我看到了两种可能的解决方法。

使用闭包

像这样定义一个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++;
    }
    ...
}