2016-11-17 5 views
-1

과 Node.js를에 비동기 루프를 만드는 것은 내가 할 노력하고있어입니다 : (위 선택은 SQL 여기

  1. 시작을 루핑 (10 배)
  2. 선택 SQL에 1 개 레지스터를 반환 한 경우 '실행하는'레코드가 null의 경우
  3. '실행'에 상태를 '실행'
  4. 는 SQL 갱신) null의 경우, 나는이 결과는 초기 SQL 기록에 업데이트됩니다
  5. 일부 데이터를 API를 액세스하고 얻을 (세트 실행 = '확인')
  6. 끝 루프 (처음부터 다시 시작)

문제는 node.js가 다시 시작을 기다리지 않고 동시에 모든 것을 수행한다는 것입니다. 그렇게하면 'running'은 항상 null입니다.

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 
} 

모든 요망?

c_sql.busca()에 대한 호출은 그들이 실제로 단지 매우 빠르게 실행 (동시에 실행하는 것,하지만 이유입니다,라고 즉시 Promise를 반환하고 then() 전에 다음 루프로 계속

답변

0

약속 전에 해결됩니다.이 동 기적으로 실행하려면

은 한 번에 하나 개의 루프는, 나는 약속이 해결 될 때까지 다시 루프를 시작하지 재귀 함수를 사용하는 것이 좋습니다 것입니다.

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