casper方法后从函数返回值

时间:2016-12-05 04:16:11

标签: javascript node.js phantomjs casperjs

在下面的代码中,我想致电checkMainBox(cthis)。我想设置它,以便此函数将返回检索的数字或false。但在checkMainBox()我不知道如何返回一个值。 number返回undefined。我很确定我不能这样做因为异步行为但是下一个最好的方法是什么?

function checkMainBox(cthis){
    var number;
    cthis.waitForSelector("._XWk", function(){
        cthis.capture("result.png");
        cthis.then(function(){
            var number = cthis.evaluate(function(){
                return $("._XWk").txt();
            })

            // console.log("number", number);
        })
    })
    return number
}

function getPhoneNumber(cthis){
    console.log("NUMBER::", checkMainBox(cthis));
       //checkMainBox(cthis) should return false or the number
}

casper.on("error", function(msg){
    this.echo("error: " + msg, "Error");
})
casper.on("page.error", function(msg, trace){
    this.echo("Page Error: " + msg, "error");
});
casper.on("remote.message", function(message){
    this.echo("Remote: " + message);
});

casper.start("http://google.com/", function(){
    this.waitForSelector("form[action='/search']");
});
casper.then(function(){
    this.fill("form[action='/search']", {q : "ebay.com phone number"}, true);
})
casper.then(function(){
    getPhoneNumber(this)
})
casper.run();

EDIT ::

最近的承诺尝试,但如果你有其他方法可以随时分享它:

function checkMainBox(cthis){
    var number;
    return new Promise(function(resolve, reject){
        cthis.waitForSelector("._XWk", function(){
            cthis.capture("result.png");
            cthis.then(function(){
                var number = cthis.evaluate(function(){
                    return $("._XWk").txt();
                })

                resolve(number)
            })
        });
    })

}

function getPhoneNumber(cthis){
    checkMainBox(cthis).then(function(result){
        console.log("NUMBER::", checkMainBox(result));
    })
    .catch(function(err){
        if(err) console.log(err);
    })

}

错误:error: ReferenceError: Can't find variable: Promise

编辑2:

function getPhoneNumber(cthis){
    // var number;
    cthis.waitForSelector("._XWk", function(){
        cthis.capture("result.png");
        cthis.then(function(){
            var number = cthis.evaluate(function(){
                return $("._XWk").html();
            })
            checkMainBox(number);
            // console.log("number", number);
        })
    })
}

function checkMainBox (number){
    // console.log("NUMBER::", number);
    return number
}

...

casper.then(function(){
    this.fill("form[action='/search']", {q : "ebay.com phone number"}, true);
})
casper.then(function(){
    var number;
    console.log(getPhoneNumber(this)) // should be the value

})
casper.run();

1 个答案:

答案 0 :(得分:1)

你可以使用一个穷人的承诺(重要的东西是大胆的):

function checkMainBox(cthis){
    var number = {};
    cthis.waitForSelector("._XWk", function(){
        cthis.capture("result.png");
        cthis.then(function(){
            number.value = cthis.evaluate(function(){
                return $("._XWk").txt();
            })
        })
    })
    return number
}

function getPhoneNumber(cthis){
    var number = checkMainBox(cthis));
    cthis.then(function(){
        console.log("outer: " + number.value);
    });
}

CasperJS已经提供了类似于Promises的环境,但是您仍然必须有一个可以异步接收值的空对象。 cthis.then非常重要,因为它会在cthis.waitForSelectorcheckMainBox完成之前处理等待。