2016-11-17 48 views
-1

這裏是我想要做的事:製作一個異步循環中node.js中使用SQL

  1. 開始一個循環(10X)
  2. 選擇上的SQL返回1個寄存器(選擇頂部1,其中「跑步」爲null)
  3. SQL更新「運行」狀態爲「運行」
  4. 如果記錄是空的,我訪問的API,並得到一些數據
  5. 結果對初始SQL記錄更新(集running ='ok')
  6. 結束循環(重新開始)

問題是,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