我正在使用CasperJS从example.com获取数据并将其发布到example.org。
casperjs代码:
var data = [];
casper.start('http://example.com', function() {
this.echo('opened');
});
casper.then(function() {
data.push( this.getHTML('div#a') ); // first text
data.push( this.getHTML('div#b') ); // second text
// ...
});
casper.thenOpen('http://example.org/', {
method: 'post',
data: {
'data_one': data[0],
'data_two': data[1],
// ...
}
});
casper.then(function() {
this.echo( data );
});
控制台结果:
first text,second text,...
我希望在example.org上收到一些数据,但我添加的所有内容(' data_one',' data_two',...)都是未定义的。
如何正确发布数据?
答案 0 :(得分:0)
问题是您可以访问data[0]
和data[1]
。
CasperJS的执行是异步的。所有then*
和wait*
函数都是异步步骤函数。调用它们只会向队列添加一个步骤,只有在调用casper.run()
时,才会执行队列。
这意味着,通过调用casper.thenOpen()
,您可以直接访问data
,但上一步尚未执行,因此尚未填充。
例如,您可以将casper.thenOpen()
分为casper.then()
和casper.open()
:
casper.then(function(){
this.open('http://example.org/', {
method: 'post',
data: {
'data_one': data[0],
'data_two': data[1],
// ...
}
});
});
请注意,您还可以嵌套步骤。它们排队等待在当前步骤结束时执行:
casper.then(function() {
data.push( this.getHTML('div#a') ); // first text
data.push( this.getHTML('div#b') ); // second text
...
this.thenOpen('http://example.org/', {
method: 'post',
data: {
'data_one': data[0],
'data_two': data[1],
// ...
}
});
});