使用sql在node.js中创建异步循环
以下是我想做的: 开始循环10倍 在sql上选择返回1寄存器选择“running”为空的前1 Sql将“正在运行”状态更新为“正在运行” 如果记录为空,则访问API并获取一些数据 结果在初始sql记录集running='ok'上更新 结束循环重新开始 事实是,node.js不会等待重新开始,它会同时执行所有操作。这样,“running”总是空的使用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
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();
}
});
}
本文可能有助于理解承诺: