2013-07-25 153 views
0

我目前想做一個卡斯帕爾模塊使用卡斯帕爾模塊做一些事情,並返回一個變量,有點像這樣:等待CasperJS模塊在返回值之前完成執行?

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完成執行?

+0

你爲什麼不使用像utilitiy [下劃線-JS] (http://underscorejs.org/#debounce)和'_.debounce()'? – mate64

+0

我不認爲這有助於我的情況。我不想將JS注入網頁,我期望在Casper實例的上下文中執行此操作,而不是網頁。 – Seiyria

回答

1

您可以使用類似於this example的類似等待函數,但是您缺少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)); 
}); 
+0

我想不出一種跨檔次的異步方式,但這是一個好方法。謝謝! – Seiyria

相關問題