Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sql在node.js中创建异步循环_Node.js_Asynchronous_Callback_Synchronous - Fatal编程技术网

使用sql在node.js中创建异步循环

使用sql在node.js中创建异步循环,node.js,asynchronous,callback,synchronous,Node.js,Asynchronous,Callback,Synchronous,以下是我想做的: 开始循环10倍 在sql上选择返回1寄存器选择“running”为空的前1 Sql将“正在运行”状态更新为“正在运行” 如果记录为空,则访问API并获取一些数据 结果在初始sql记录集running='ok'上更新 结束循环重新开始 事实是,node.js不会等待重新开始,它会同时执行所有操作。这样,“running”总是空的 var express = require('express'); var app = express(); var c_MyApi = requir

以下是我想做的:

开始循环10倍 在sql上选择返回1寄存器选择“running”为空的前1 Sql将“正在运行”状态更新为“正在运行” 如果记录为空,则访问API并获取一些数据 结果在初始sql记录集running='ok'上更新 结束循环重新开始 事实是,node.js不会等待重新开始,它会同时执行所有操作。这样,“running”总是空的

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的调用会立即返回一个承诺,然后在调用之前继续下一个循环,这就是为什么它们似乎在运行的同时运行,实际上运行得非常快,但在承诺得到解决之前

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

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();
        }
    });
}
本文可能有助于理解承诺: