在下面的代码中,我想致电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();
答案 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.waitForSelector
内checkMainBox
完成之前处理等待。