2016-11-16 1 views
1

Le Javascript ci-dessous est destiné à utiliser NightmareJS pour rechercher un site Web pour 3 messages et retourner le nom d'utilisateur de celui qui a téléchargé la publication.Comment faire plusieurs requêtes en utilisant NightmareJS?

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++; 
} 

Pour une raison quelconque, ce code donne les résultats suivants lors de l'exécution dans l'invite de commande:

Search failed {} 
Search failed {} 

J'ai du mal à comprendre pourquoi cela ne fonctionne pas. J'ai essayé d'utiliser ce code (sans la boucle while) pour exécuter une seule fois pour un post spécifique, en utilisant runNext(inputArray[0]) et cela fonctionne très bien. Donc, quand j'essaie d'ajouter une boucle while pour obtenir des informations sur plusieurs messages, pourquoi cela ne fonctionne-t-il pas?

Répondre

1

Nightmare est asynchrone. Les erreurs se produisent parce que vous appelez runNext trois fois dans une boucle à la fois - n'attendant pas que les recherches précédentes se terminent. Par conséquent, les deux premières recherches ont été interrompues juste après le démarrage et seules les dernières ont le temps de se terminer.

Essayez de lancer la recherche suivante à la fin de la précédente:

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

Salut, merci pour votre aide. J'ai mis à jour mon code pour fonctionner de cette manière, mais il ne renvoie que le nom d'utilisateur 1 - le nom d'utilisateur pour le premier post vérifié. Une idée pourquoi? –

+0

Désolé, jamais travaillé avec Nightmare auparavant, a dû vérifier les docs à éditer. Voir la réponse mise à jour, essayé et fonctionne. On dirait que la méthode '.end()' sert à arrêter le processus et a dû être supprimée. Une autre méthode, '.halt()' ajouté à la sortie à la fin. – Vaviloff