等待CasperJS模块完成执行后再返回值

Wait for CasperJS module to finish executing before returning a value?

本文关键字:返回值 执行 CasperJS 模块 等待      更新时间:2023-09-26

我目前正在尝试制作一个使用Casper模块执行某些操作的Casper模块,并从中返回一个变量,有点像这样:

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中获得的一样,但您缺少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));
});