【问题标题】:Making an async loop in node.js with sql使用 sql 在 node.js 中创建异步循环
【发布时间】:2016-11-18 03:35:18
【问题描述】:

这是我想要做的:

  1. 开始循环 (10x)
  2. 在 sql 上选择以返回 1 个寄存器(选择顶部 1,其中 'running' 为空)
  3. Sql 将“正在运行”状态更新为“正在运行”
  4. 如果记录为空,我访问 API 并获取一些数据
  5. 结果在初始 sql 记录上更新(设置 running = 'ok')
  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
}

有什么建议吗?

【问题讨论】:

    标签: node.js asynchronous callback synchronous


    【解决方案1】:

    对c_sql.busca() 的调用立即返回Promise,然后在调用then() 之前继续下一个循环,这就是它们似乎同时运行的原因(它们实际上只是运行得非常快,但在 Promise 解决之前。

    如果您希望它同步运行,一次一个循环,我建议使用递归函数在 Promise 解决之前不要再次启动循环。

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

    这篇文章可能有助于理解 Promises:https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 2017-06-16
      • 2015-02-27
      • 1970-01-01
      • 2013-02-16
      • 2015-04-11
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多