如何在CasperJS中完成评估步骤?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在CasperJS中完成评估步骤?相关的知识,希望对你有一定的参考价值。

假设我有这个脚本:

var me = null;

casper
    .start()
    .then(function(){
        me = this.evaluate(someFunction);
    })
    .wait(5000) //this what i doing until now
    .then(nextFunction)

casper.run()

我需要从evaluate计算me然后在nextFunction中执行me

问题是,我不知道评估结束的确切时间。为了解决这个问题,我通常会在一定时间内使用wait()。

我不喜欢这个,因为我不能尽快执行nextFunction。在jQuery中我可以使用callback / promise来摆脱这个,但是如何在casperJS上执行此操作?

我试试这个,但没有运气,

var me = null;

casper
    .start()
    .then(myEval)
    .wait(5000) //this what i doing until now
    .then(nextFunction)

casper.run()

function myEval(){
    me = this.evaluate(someFunction);
    if(me==null) this.wait(2000, myEval);
}

所以我一直在我的脚本中添加丑陋的wait()因为我学习casperjs直到现在。

更新

建议答案的结果:

var casper = require('casper').create();
var me = 'bar';

function timeoutFunction(){
    setTimeout(function(){
        return 'foo';
    },5000);
}

function loopFunction(i){
    var a = 0;
    for(i=0; i<=1000;i++){
        a=i;
    }
    return a;
}

function nextFunction(i){
    this.echo(i);
}

casper
    .start('http://casperjs.org/')
    .then(function(){
            me = this.evaluate(timeoutFunction);
            return me;
    }).then(function() {
        this.echo(me); //null instead foo or bar
        me = this.evaluate(loopFunction);
        return me
    }).then(function() {
        this.echo(me);//1000 => correct
        nextFunction(me); //undefined is not function. idk why 
    });
casper.run();
答案

你可以做Promises链接,像这样:

casper
.start()
.then(function(){
    me = this.evaluate(someFunction);
    return me;
}).then(function(me) {
  // me is the resolved value of the previous then(...) block
  console.log(me);
  nextFunction(me);
  });

另一个通用的例子可以找到here

以上是关于如何在CasperJS中完成评估步骤?的主要内容,如果未能解决你的问题,请参考以下文章

While 循环设置 CasperJS “then()” 步骤

CasperJS:在代码中配置代理选项

如何告诉 CasperJS 循环浏览一系列页面

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段