我正在尝试拆分以下代码,以便将回调函数存储在自己的文件中。
var casper = require('casper').create();
casper.start("http://www.google.com/", function() {
this.echo(this.getTitle());
});
casper.run(); // "Returns Google"
在this example之后,我在一个名为" getPageTitle.js";
的单独文件中定义一个函数function getPageTitle(casper) {
casper.echo(casper.getTitle());
}
exports.getPageTitle = getPageTitle;
并在另一个名为" main.js"的文件中调用该函数。通过将CasperJS对象直接传递给函数;
var casper = require('casper').create();
var casperFunctions = require('./getPageTitle.js');
casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));
# Error: CasperError: Casper is not started, can't execute `getTitle()`
此外,如果我用thenOpen()
电话替换上面的最后一行;
casper.start();
casper.thenOpen("http://www.google.com/", casperFunctions.getPageTitle(casper));
上面的代码不会抛出错误; CasperJS能够导航到网站,但页面标题" Google"不归还。
有人可以说明为什么这不符合我的预期。这似乎是模块化CasperJS在页面加载时会调用的函数的一种自然方式,但我在这里错过了什么?
答案 0 :(得分:2)
CasperJS的执行是异步的。 start()
以及所有then*()
和wait*()
函数都是异步步骤函数。这意味着您只能在诸如步骤之类的页面内。
当您查看getPageTitle()
以及如何调用它时,您应该注意到您未将步骤函数传递到casper.start()
,而是您立即调用{ {1}}。那时,执行甚至还没有开始,因为一旦调用getPageTitle()
,计划的步骤就开始执行。通过致电run()
,您正在尝试访问标题为:空白空白。
第一个版本:
getPageTitle()
现在您将步骤函数传递给function getPageTitle(casper) {
return function(){
casper.echo(casper.getTitle());
};
}
,这将被异步评估。
第二版:
请注意,您可以在步骤函数中使用start()
来引用this
。这是一种更好的方法,因为您不需要明确传递引用:
casper
并将其称为:
function getPageTitle() {
return function(){
this.echo(this.getTitle());
};
}
第三版:
如果您的功能不需要任何参数,那么您不需要包装函数。你可以直接传递它:
casper.start("http://www.google.com/", casperFunctions.getPageTitle());
并将其称为:
function getPageTitle() {
this.echo(this.getTitle());
}
答案 1 :(得分:0)
casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));
不起作用,因为您将调用casperFunctions.getPageTitle(casper)
的结果作为回调参数传递给casper.start
我认为你应该能够做到这一点
casper.start("http://www.google.com/", casperFunctions.getPageTitle.bind(casper));