代码之家  ›  专栏  ›  技术社区  ›  plonknimbuzz

如何等到CasperJS中的evaluate步骤完成?

  •  -1
  • plonknimbuzz  · 技术社区  · 6 年前

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

    我需要计算一下 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);
    }
    

    更新

    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();
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Barzev    6 年前

    你可以这样做:

    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