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);