在casper方法之后从函数返回值

在下面的代码中,我想调用checkMainBox(cthis) 。 我想设置它,使这个函数将返回检索的数字或错误。 但在checkMainBox()我不知道如何返回一个值。 数字返回undefined。 我很确定我不能这样做,因为asynchronous行为,但下一个最好的方法是什么?

 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(); 

编辑::

最近尝试的承诺,但如果你有另一种方式做到这一点,可以随意分享:

 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(); 

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

 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的环境,但是你仍然必须有一个可以asynchronous接收值的空对象。 cthis.then很重要,因为它处理等待,直到cthis.waitForSelectorcheckMainBox完成。