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()
ycasper.open()
a una sola llamadacasper.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.