2016-11-17 6 views
-1

Вот что я пытаюсь сделать:Создание цикла асинхронного в Node.js с SQL

  1. Запустить циклический (10x)
  2. Выберите на SQL для возврата 1 регистра (выберите верхний 1, где «работает» равно нулю)
  3. Sql обновление «работает» статус «работает»
  4. Если запись имеет нулевое значение, я получить доступ к API и получить некоторые данные
  5. результат обновляется на исходной записи SQL (набор running = 'ok')
  6. Завершение конца (начало)

Thing is, node.js не ждет начала, он делает все в одно и то же время. Таким образом, «запуск» всегда равен нулю.

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 
} 

Любые санкции?

ответ

0

Вызов c_sql.busca() немедленно возвращает Promise, а затем переходить к следующей итерации до then() называется, поэтому они, как запустить в то же время (на самом деле они просто работают очень быстро, но до обещанного решена.

Если вы хотите, чтобы работать синхронно, один цикл, в то время, я бы рекомендовал использовать рекурсивную функцию, чтобы не запустить цикл снова, пока Обещания не решен.

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

Эта статья может быть полезным в понимании обещаний: https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8

Смежные вопросы