Javascript 在返回值之前,是否等待CasperJS模块完成执行?
我目前正在尝试创建一个Casper模块,它使用Casper模块执行某些操作,并从中返回一个变量,有点像这样:Javascript 在返回值之前,是否等待CasperJS模块完成执行?,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我目前正在尝试创建一个Casper模块,它使用Casper模块执行某些操作,并从中返回一个变量,有点像这样: var data = []; exports.parsePage = function(argUrl) { url = baseUrl = argUrl; if (!url) { casper.warn('No url passed, aborting.').exit(); } casper.start('https://js-ur
var data = [];
exports.parsePage = function(argUrl) {
url = baseUrl = argUrl;
if (!url) {
casper.warn('No url passed, aborting.').exit();
}
casper.start('https://js-uri.googlecode.com/svn/trunk/lib/URI.js', function() {
var scriptCode = this.getPageContent() + '; return URI;';
window.URI = new Function(scriptCode)();
if (typeof window.URI === "function") {
this.echo('URI.js loaded');
} else {
this.warn('Could not setup URI.js').exit();
}
//process is a function that processes the page
}).run(process);
return data;
}
var scanner = require('./pageParser');
console.log(JSON.stringify(scanner.parsePage('http://url.com')));
我的测试是这样的:
var data = [];
exports.parsePage = function(argUrl) {
url = baseUrl = argUrl;
if (!url) {
casper.warn('No url passed, aborting.').exit();
}
casper.start('https://js-uri.googlecode.com/svn/trunk/lib/URI.js', function() {
var scriptCode = this.getPageContent() + '; return URI;';
window.URI = new Function(scriptCode)();
if (typeof window.URI === "function") {
this.echo('URI.js loaded');
} else {
this.warn('Could not setup URI.js').exit();
}
//process is a function that processes the page
}).run(process);
return data;
}
var scanner = require('./pageParser');
console.log(JSON.stringify(scanner.parsePage('http://url.com')));
在parsePage函数中返回数据之前,是否可以等待casper完成执行?您可以使用类似于取自phantomjs的in的等待函数,但缺少javascript的一个基本概念:异步和回调 所以,一个可能的解决办法是 模块
pageParser.js
:
function process(callback) {
//do something here
callback(data);
}
exports.parsePage = function(argUrl, callback) {
...
casper.start('https://js-uri.googlecode.com/svn/trunk/lib/URI.js', function() {
...
}).run(process(callback));
}
主脚本:
var scanner = require('./pageParser');
scanner.parsePage('http://url.com', function(data) {
console.log(JSON.stringify(data));
});
你为什么不使用像and
\u.debounce()
这样的实用工具呢?我认为这对我的情况没有帮助。我不想把JS注入到网页中,我想在Casper实例的上下文中,而不是在网页中,我想不出一种方法来实现跨文件的异步,但这里有一个好方法。谢谢