type close javascript node.js npm phantomjs nightmare

javascript - close - ¿Cómo se pueden realizar múltiples consultas cuando se usa NightmareJS?



nightmare type (1)

El siguiente JavaScript está destinado a utilizar NightmareJS para buscar en un sitio web 3 publicaciones y devolver el nombre de usuario de quien haya subido la publicación.

var Nightmare = require(''nightmare''); var nightmare = Nightmare({ show: true }); var inputArray = [198,199,201]; var runNext = function (i) { nightmare .goto(''http://theshitpit.com/goto.php'') .insert(''form [name=postnum]'', i) .click(''form [type=submit]'') .wait() .evaluate(function () { return document.querySelector(''.username'').innerHTML }) .end() .then(function (result) { console.log(result) }) .catch(function (error) { console.error(''Search failed:'', error); }); } var index = 0; while(index<inputArray.length){ runNext(inputArray[index]); index++; }

Por algún motivo, este código muestra lo siguiente cuando se ejecuta en el símbolo del sistema:

Search failed {} Search failed {}

He estado luchando por entender por qué esto no está funcionando. He intentado usar este código (sin el bucle while) para ejecutar solo una vez para una publicación específica, usando runNext(inputArray[0]) y esto funciona bien. Entonces, cuando trato de agregar un ciclo while para obtener información sobre varias publicaciones, ¿por qué no funciona?


Nightmare es asincrónico. Los errores ocurren porque llama a runNext tres veces en un bucle de una vez, sin esperar a que finalicen las búsquedas anteriores.

Entonces, las primeras dos búsquedas se inician inmediatamente después del inicio y solo la última tiene tiempo para completarse.

Intente iniciar la siguiente búsqueda al final de la anterior:

var Nightmare = require(''nightmare''); var nightmare = Nightmare({ show: true }); var inputArray = [198, 199, 201]; var index = 0; var runNext = function (i) { nightmare .goto(''http://theshitpit.com/goto.php'') .insert(''form [name=postnum]'', inputArray[i]) .click(''form [type=submit]'') .wait() .evaluate(function () { return document.querySelector(''.username'').innerHTML }) .then(function (result) { console.log(result); }) .then(function(){ index++; // We will only run bext search when we successfully got here if(index < inputArray.length){ runNext(index); } else { console.log("End"); nightmare.halt(); } }) .catch(function (error) { console.error(''Search failed:'', error); }); } runNext(index);