我试图拆分以下代码,以便将存储在自己文件中的回调函数。
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就会调用这些函数,但这里是不是遗漏了什么呢?
发布于 2015-07-22 14:26:21
CasperJS的执行是异步的。start()和所有then*()和wait*()函数都是异步步骤函数。这意味着您只在步骤的页面中。
当您查看您的getPageTitle()以及如何调用它时,您应该注意到,您没有将step函数传递到casper.start(),而是立即调用getPageTitle()。当时,执行甚至还没有开始,因为计划的步骤在调用run()时就开始执行。通过调用getPageTitle(),您将尝试访问“关于:空白”(即空白)的标题。
第一版:
function getPageTitle(casper) {
return function(){
casper.echo(casper.getTitle());
};
}现在,您要将一个step函数传递到start()中,该函数将被异步计算。
第二版:
请记住,可以在step函数中使用this来引用casper。这是一个更好的方法,因为您不需要显式传递引用:
function getPageTitle() {
return function(){
this.echo(this.getTitle());
};
}就这样叫它:
casper.start("http://www.google.com/", casperFunctions.getPageTitle());第三版:
如果函数不需要任何参数,那么就不需要包装函数。您可以直接传递:
function getPageTitle() {
this.echo(this.getTitle());
}就这样叫它:
casper.start("http://www.google.com/", casperFunctions.getPageTitle);发布于 2015-07-22 14:25:01
casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));不起作用,因为要将调用casperFunctions.getPageTitle(casper)的结果作为回调参数传递给casper.start
我想你应该可以代替
casper.start("http://www.google.com/", casperFunctions.getPageTitle.bind(casper));https://stackoverflow.com/questions/31565769
复制相似问题