javascript loops post phantomjs casperjs

javascript - CasperJS publica solo el último elemento varias veces desde mi for-loop



loops post (1)

Todas las funciones then* y wait* de CasperJS son funciones de paso asíncronas y JavaScript tiene un alcance de nivel de función .

Esto significa que el bucle for se ejecuta inmediatamente y se programan varios pasos then() para que se ejecuten después de que for-loop haya finalizado por completo. En ese punto, la description variables de nivel de función, target_date , etc. tendrá el valor de la última i y i será 10. Aquí hay un ejemplo general de JavaScript de eso: cierre de JavaScript dentro de los bucles: ejemplo práctico simple

Tu también puedes

  • cambie las dos llamadas casper.then() y casper.open() a una sola llamada casper.thenOpen() donde las variables de bucle se pasan directamente a la función:

    casper.thenOpen(''http://localhost:1337/events'', { method: ''post'', data: { ''description'': description, ''target_date'': target_date, ''target_location'': target_location, }, headers: { "stuff":"stuff" } });

  • o "cerrar" las variables para cada iteración mediante la introducción de un 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" } }); }); })(); }

CasperJS es increíble, pero no está publicando en mi servidor local cuál es la salida de mi consola.

casper.wait(5000, function () { casper.wait(1000, function () { casper.then(function(){ for (var i = 0 ; i < 10; i++) { 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" } }); }); } this.echo(''POST '' + i ); }); }); }); casper.run();

Console.log está produciendo exactamente cuando yo quiero, pero solo publica el último elemento. Traté de agregar casper.wait en una variedad de lugares, pero no pareció ayudar.