Post 数据在 CasperJS 中使用数组
Post data using array in CasperJS
我正在使用 CasperJS 从 example.com 和 post 获取数据到 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'、...)都未定义。
我怎样才能post数据正确?
问题是您在 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],
// ...
}
});
});
我正在使用 CasperJS 从 example.com 和 post 获取数据到 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'、...)都未定义。
我怎样才能post数据正确?
问题是您在 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],
// ...
}
});
});