我正在与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
内访问相应的数组索引?
答案 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++;
}
...
}