gpt4 book ai didi

javascript - Casper - 了解使用函数回调进行评估

转载 作者:行者123 更新时间:2023-11-29 10:19:32 24 4
gpt4 key购买 nike

这是一个有点棘手的问题。

我非常熟悉 javascript,但是我在一个使用 PhantomJS 和 CasperJS 自动抓取网站的项目中。这些对我来说都是全新的主题。

我能够弄清楚如何使用 Casper 并进行导航、登录页面等,但是它很笨拙,因为一般流程似乎是这样的:

casper.start('http://google.fr/');

casper.then(function() {
this.echo("I'm in your google.");
});

casper.then(function() {
this.echo('Now, let me write something');
});

casper.then(function() {
this.echo('Oh well.');
});

casper.run();

我的问题是我想对网站做各种各样的事情,这取决于从中获取的数据。我无法预先布置导航顺序并且不更改它。我希望这是有道理的。

为了解决这个问题,我创建了一个带有内置函数的 Javascript Navigator 对象。我的一般概念是:

navigator.logIn(function() 
{
navigator.actionA(parameters, function()
{
if (navigator.data.a == navigator.data.b) {
navigator.actionB();
} else {
navigator.actionC();
}
});
});

每个函数中都嵌入了 casper 函数。

这是我实际代码的简化版本,事情开始变得奇怪:

var casper = require('casper').create({
clientScripts: [ 'jquery.min.js' ],
onError: function(self, m) {
console.log('FATAL:' + m);
self.exit();
},
});

var navigator = new _Navigator();

function _Navigator() { }

_Navigator.prototype.logIn = function(aCallback)
{
var self = this;

casper.start('https://website/login.asp', function()
{
if (1 == 1) {
this.evaluate(function() {
$("input[name=blah]").val('blahblah');
});

// ... A LOT MORE CODE
aCallback();
}
});
}

_Navigator.prototype.search = function(aDataSet, aCallback)
{
var self = this;

console.log('this works');
casper.then(function(){
console.log('this works');
});

var firstName = 'foobar';

casper.then(function(){
console.log('this works');
this.evaluate(function()
{
console.log('this no longer works!!');
$('input[id=blah]').val(firstName);
aCallback();
});
});
}

navigator.logIn(function() {
// LOG IN RUNS, AND CALLS BACK SUCCESSFULLY...
navigator.search({'dataset'}, function()
{
console.log('This never runs');
});
});

casper.run();

你会注意到在 navigator.login 函数中,我调用了 casper.start();在这里,评估函数工作正常,但是我在那个 casper.start(); 中做了一个回调函数;在我的回调中,我调用了下一个函数 navigator.search,我想它在技术上仍在 casper.start 中执行?

当我尝试在第一个回调函数调用的这个新函数中运行 casper.evaluate 时,除了 casper.evaluate 不再起作用之外,一切似乎都运行良好!它似乎吃掉了这个功能,不打印任何控制台日志或任何东西。

我已经尝试了一切。我不确定如何正确执行此操作。有人对我做错了什么有什么建议吗?谢谢。

最佳答案

我知道这已经很老了,但是:这里发生的事情是两个问题的结合:

  • casper.evaluate() 似乎吞噬了当前堆栈中的所有错误 - onError 不会从 .evaluate() 内部运行 回调。

  • .evaluate 中使用的函数不是标准闭包 - 它们是沙盒化的,并且无法访问其范围之外的变量,除非作为显式参数传递到 casper.evaluate。因此,在您调用 aCallback() 的评估函数中,范围内没有 aCallback,并且该函数将(静默地)失败并出现 ReferenceError

关于javascript - Casper - 了解使用函数回调进行评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com