2017-09-12 5 views
1

Je suis nouveau sur le noeud js. J'utilise une boucle for pour lancer la même fonction plusieurs fois avec des valeurs différentes. J'utilise aussi une requête pour gratter les données d'un site web. Mais si j'ai terminé tout mon processus, ce script ne se termine pas automatiquement. en raison de nombreuses raisons comme la demande de connexion non fermée, etc. Il fonctionne de manière asynchrone, donc je ne peux pas le fermer manuellement. Si j'utilise process.exit(); dans la dernière ligne de for loop, il se ferme immédiatement avant d'exécuter la fonction. Comment quitter ce script si ma boucle for est terminée? Aidez-moi, s'il vous plaît.comment quitter un script js node si tout le processus se termine

mon code de travail est:

const request = require('request'); 
const cheerio = require('cheerio'); 
const Sequelize = require('sequelize'); 
var redis = require("redis"), 
client = redis.createClient(); 
var id = [20434, 21794, 21825, 21350, 20753, 20451]; 

const sequelize = new Sequelize('xyz', 'root', 'root', { 
    host: 'localhost', 
    dialect: 'mysql', 
    pool: { 
     max: 5, 
     min: 0, 
     idle: 90000, 
     acquire: 90000 
    }, 
}); 
const User = sequelize.define('abcd', { 
    'X': { 
     type: Sequelize.STRING 
    }, 
    'Y': { 
     type: Sequelize.STRING 
    }, 
    'A': { 
     type: Sequelize.INTEGER 
    }, 
    'abc': { 
     type: Sequelize.STRING 
    }, 
    'info': { 
     type: Sequelize.STRING 
    }, 
},{ 
    tableName: 'xyz' 
}); 

for(var x=0; x<id.length; x++){ 
    scrapeweb(id[x], x); 
} 

function scrapeweb(id, text, done){ 
    try { 
     switch(text) { 
      case 0: 
       lang = "english"; 
       break; 
      case 1: 
       lang = "hindi"; 
       break; 
      case 2: 
       lang = "tamil"; 
       break; 
      case 3: 
       lang = "malayalam"; 
       break; 
      case 4: 
       lang = "kannada"; 
       break; 
      case 5: 
       lang = "telugu"; 
       break; 
      default: 
       lang = "language" 
       break; 
     } 
     request("http://www*xyz*com/jfkdh/"+id+"/", function(error, response, body) { 
      if(error) { 
       console.log(error); 
       var err = new Error('Exception in requesting url') 
       throw err 
      }   
      //scrap the given url and get song-names  
      ..... 
..... 
..... 
..... 
       for(var i=0; i<text.length; i++){ 

        //DB section to check the song is available or not. 
        User.findOne({attributes: ['A', 'B'], 
         where: { 
          B: { $like: '%'+word[i]+'%'} , 
          X: "....." 
         } 
        }).then(data => { 
         if(data != null) { 
          //Redis section 
          client.on("error", function (err) { 
           console.log(err); 
           var err = new Error('Exception in redis client connection') 
           throw err         
          }); 
          if(client.hexists('word', data.dataValues['A']) == true) { 
           client.hincrby('word', data.dataValues['A'] , 1); 
          } else { 
          // client.hincrby('word', 'count', 1); 
           client.hmset('word', data.dataValues['A'], 0); 
           client.expire('word', 86400); 
          } 
          console.log(data.dataValues['B']+" is available and language = "+lang); 
         } else { 
         console.log("word is not avilable"); 
         } 
        }); 
       } 
      }); 
     }); 
    } catch(err) { 
     console.log(err);  
    } 
} 
+0

Postez votre code que vous avez essayé .. – Subburaj

+0

a ajouté mon code. Veuillez vérifier maintenant –

+0

Utilisez '' 'request-promise''' (https://github.com/request/request-promise) et placez toutes vos demandes dans un' '' 'Promise.all'''. Vous pouvez '' '.then''' quand ils sont complets et lancer' '' process.exit() '' ''. Ils ont écrit votre code que vous n'allez pas avoir un bon moment pour le retirer – Wainage

Répondre

0

Modifier votre fonction "scrapeweb" afin qu'il retourne la promesse pour chaque appel. Lors de l'appel d'une boucle, stockez toutes les promesses dans un tableau afin de pouvoir vérifier "Promise.all". À la fin de "Promise.all", votre script va s'arrêter ou vous pouvez faire votre action désir.

+0

Modifier scrapeweb signifie quoi? ce que j'ai besoin de changer dans cette fonction? comment utiliser promise.all dans la boucle? –

+0

Vous pouvez utiliser promise.all comme ci-dessous: let promet = []; for (var x = 0; x { // Toutes promettent avec succès }) .catch (err => { console.error ('err', err); }); fonction scrapeweb (id, texte, fait) { \t retour nouvelle promesse ((résolution, rejeter) => { \t \t // faire toute action ici. \t \t // À l'issue de la réussite de votre tâche « détermination de retour (true) ». "retour de rejet()" si l'erreur que vous voulez jeter l'erreur. \t \t // ..... \t \t détermination de retour (true) \t})} –