我正在使用CasperJS来抓取一个站点,构建一个JSON对象来组织所捕获的信息,然后将这样的JSON对象POST到一个ETL信息到数据库的服务(在PHP中)。
这就是问题,每当我尝试发送JSON对象时,对象都是空的,这是我用来发送信息的代码。
casper.then(function(){
var productDetails = {};
this.each(products,function(self, product){
self.thenOpen(product, function(a){
productDetails = this.evaluate(getProductDetails);
});
self.thenOpen('http://localhost.endpoint.lan/saveScrapingData.php', {
method:'post',
data: {
name:'Alan',
info: productDetails
},
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
});
});
});
问题是productDetails被发送为空,我不知道为什么,因为如果我console.log
此时变量:
self.thenOpen(product, function(a){
productDetails = this.evaluate(getProductDetails);
});
变量不是空的,很可能这是一个竞赛条件。变量在包含任何数据之前发送,但我不明白为什么会发生这种情况,如果我在确定变量包含数据后发送数据。
答案 0 :(得分:2)
是的,在致电thenOpen
时,productDetails
变量仍未定义。您可以将thenOpen
来电分成then
和open
,以便在实际调用open
时定义。
self.then(function(){
this.open('http://localhost.endpoint.lan/saveScrapingData.php', {
method:'post',
data: {
name:'Alan',
info: productDetails
},
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
});
});
这是因为casper步骤的异步方式(then*
或wait*
)。它们已预定但稍后执行。问题是,通过使用设置对象调用thenOpen
会将productDetails
的值修复为undefined
,因为上一步尚未执行。