CasperJS仅从我的for循环中多次发布最后一项

时间:2016-02-23 03:16:01

标签: javascript loops post phantomjs casperjs

CasperJS非常棒,但它没有向我的localhost发布我的控制台输出。

{ WEB_MEMORY: '512',
PATH: '/app/.heroku/node/bin:/usr/local/bin:/usr/bin:/bin:/app/bin:/app/node_modules/.bin',
WEB_CONCURRENCY: '1',
PWD: '/app',
NODE_ENV: 'production',
PS1: '\\[\\033[01;34m\\]\\w\\[\\033[00m\\] \\[\\033[01;32m\\]$ \\[\\033[00m\\]',
SHLVL: '1',
HOME: '/app',
NODE_HOME: '/app/.heroku/node',
PORT: '34225',
_: '/app/.heroku/node/bin/node' }

Console.log正好在我想要的时候输出,但它只发布了最后一项。我试图在各种地方添加casper.wait,但它似乎没有帮助!

1 个答案:

答案 0 :(得分:1)

CasperJS中的所有then*wait*函数均为asynchronous step functionsJavaScript has function-level scope

这意味着for循环立即执行,并且在for循环完成后计划执行几个then()步骤。此时,函数级变量descriptiontarget_date等都将具有上一个i的值,i将为10.这是一般JavaScript例如:JavaScript closure inside loops – simple practical example

你可以

  • 将两个调用casper.then()casper.open()更改为单个调用casper.thenOpen(),其中循环变量直接传递给函数:

    casper.thenOpen('http://localhost:1337/events', {
        method: 'post',
            data:   {
            'description': description,
            'target_date':  target_date,
            'target_location':  target_location,
        },
        headers: {
           "stuff":"stuff"
        }
    });
    
  • 或"关闭"通过引入IIFE来进行每次迭代的变量:

    for  (var i = 0 ; i < 10; i++) {
        (function(){
            var description = casper.fetchText(x('//*[@id="acDataId-local'+i+'"]/a')); //*[@id="acDataId-local0"]/a
            console.log(description);
            var target_date = casper.fetchText(x('//*[@id="dtDataId-local'+i+'"]/text()[1]')); 
            console.log(target_date);
            var target_location = casper.fetchText(x('//*[@id="veDataId-local'+i+'"]')); 
            console.log(target_location);
    
    
            console.log(i, description)
    
    
            casper.then(function () {
    
                casper.open('http://localhost:1337/events', {
                    method: 'post',
                        data:   {
                        'description': description,
                        'target_date':  target_date,
                        'target_location':  target_location,
                    },
                    headers: {
                       "stuff":"stuff"
                    }
                });
            });
        })();
    }