2016-11-17 1 views
-1

Voici ce que je suis en train de faire:Faire une boucle Async Node.js avec sql

  1. Démarrer une boucle (10x)
  2. Sélectionnez sur SQL pour retourner 1 registre (sélectionner top 1 où « running » est null)
  3. mise à jour Sql « running » statut « running »
  4. Si l'enregistrement est nul, j'accéder à une API et d'obtenir des données
  5. le résultat est mis à jour sur le dossier sql initial (set running = 'ok')
  6. Terminer la boucle (recommencer)

Cela étant, node.js n'attend pas de recommencer, il fait tout en même temps. De cette façon, 'running' est toujours nul.

var express = require('express'); 
var app = express(); 

var c_MyApi = require('./controller/call_MyApi'); 
var mongo = require('./controller/crud_mongo'); 
var c_email = require('./controller/api_email_verify'); 
var c_sql = require('./controller/consulta_sql'); 


var MyLink = '', 
    id = 0; 

for(var i = 0 ; i < 10 ; i++){ 

    c_sql.busca().then(function(res) { 
     MyLink = res[0].MyLink; 
     id = res[0].id; 

     c_sql.marca(id).then(
      c_MyApi.busca(MyLink, function(a) { 
       if (a == 0) { 
        c_sql.atualiza(id, 'sem_email', 's/e'); 
       } 
       if (a == 1) { 
        c_sql.atualiza(id, 'link_errado', 'l/e'); 
       } else { 
        for (var i = 0; i < a.length; i++) { 
         var email = a[i].address; 
         c_email.busca(email, function(e_valid) { 
          c_sql.atualiza(id, email, e_valid) 
         }) 
        } 

       } 
      }) 
     ) 

    }) 
} 

} 


//consulta_sql.js 
var sql = require("seriate"); 

var search = function() { 
    var exec = 'select top 1 MyLink, id from sys_robo_fila where done is null'; 

    sql.setDefaultConfig(config); 

    return sql.execute({ 
     query: exec 
    }); 
} 

var usado = function(id) { 
    var exec = "update sys_robo_fila set done = 'r' where id = " + id + ""; 

    sql.setDefaultConfig(config); 

    return sql.execute({ 
     query: exec 
    }); 
} 

var update = function(id, email, valid) { 
    var exec = "update sys_robo_fila set email = '" + email + "' , validacao = '" + valid + "' , done = 'ok' where id = " + id + ""; 

    sql.setDefaultConfig(config); 

    return sql.execute({ 
     query: exec 
    }); 
} 

module.exports = { 
    busca: search, 
    atualiza: update, 
    marca: usado 
} 

Toutes les sugestions?

Répondre

0

L'appel à c_sql.busca() renvoie une Promise immédiatement et continuer à la boucle suivante avant then() est appelée, ce qui est la raison pour laquelle ils semblent fonctionner en même temps (ils sont en fait juste en cours d'exécution très rapidement, mais avant la promesse est résolu.

Si vous voulez que cela fonctionne de manière synchrone, une boucle à la fois, je vous recommande d'utiliser une fonction récursive pour ne pas démarrer la boucle à nouveau jusqu'à ce que les promesses ont résolu.

let count = 0; 

function doSomething() { 
    // this returns immediately, before .then() executes 
    return c_sql.busca() 
    .then(() => { 
     // do some more stuff after c_sql.busca() resolves 
     return c_sql.busca(); 
    }) 
    .then(() => { 
     // increment your count 
     count += 1 
     if (count<10) { 
      // less than 10 runs call the function again to start over 
      return doSomething(); 
     } 
    }); 
} 

cet article pourrait être utile pour comprendre les promesses: https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8