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],
            // ...
        }
    });
});