Javascript for循环中的异步函数
您好,我正在尝试将sqlite数据库转换为NeDb,代码如下:Javascript for循环中的异步函数,javascript,node.js,Javascript,Node.js,您好,我正在尝试将sqlite数据库转换为NeDb,代码如下: const sqliteJSON = require('sqlite-json'); const Datastore = require('nedb') const exporter = sqliteJSON('etecsa.db'); db = new Datastore('etecsa.nedb'); db.loadDatabase(); tables = ['fix','movil']; tables.forEach(
const sqliteJSON = require('sqlite-json');
const Datastore = require('nedb')
const exporter = sqliteJSON('etecsa.db');
db = new Datastore('etecsa.nedb');
db.loadDatabase();
tables = ['fix','movil'];
tables.forEach(function(table) {
sql = 'select count(1) from ' + table;
exporter.json(sql, function (err, json) {
toNeDB(table, JSON.parse(json)[0]['count(1)'])
});
}, this);
var toNeDB = function(table, count) {
var inc = 10000;
console.log(table + ' => ' + count)
for (var i = 0; i < count + inc; i += inc) {
var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ i + ' , ' + inc;
console.log(i)
exporter.json(sql, function(err, json) {
var data = JSON.parse(json);
db.insert(data, function (err, newDoc) {});
});
}
}
以及输出:
1 'fix' 10000
10001 'fix' 10000
....
1150001 'fix' 10000
1 'movil' 10000
10001 'movil' 10000
...
3730001 'movil' 10000
{ number: '8775031',
name: 'UNION ELECTRICA',
address: 'S ALLENDE #666 OQUENDO SOLEDAD',
province: 7 }
{ number: '8734454',
name: 'EMP ESTB ESP Y SERVICIOS',
address: 'ESAPDA #256 CONCORDIA S LAZARO',
province: 7 }
如果您需要知道每个操作发生的时间,您应该将
console.log
放在回调中
诸如此类:
var toNeDB = function(table, count) {
var inc = 10000;
console.log(table + ' => ' + count)
for (var i = 0; i < count + inc; i += inc) {
var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ i + ' , ' + inc;
exporter.json(sql, (function(i) {
return function(err, json) {
console.log(i)
var data = JSON.parse(json);
db.insert(data, function (err, newDoc) {});
}
})(i));
}
}
var toNeDB=函数(表,计数){
var inc=10000;
console.log(表+'=>'+计数)
对于(变量i=0;i
如果您需要知道每个操作何时发生,您应该将控制台.log
放在回调中
诸如此类:
var toNeDB = function(table, count) {
var inc = 10000;
console.log(table + ' => ' + count)
for (var i = 0; i < count + inc; i += inc) {
var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ i + ' , ' + inc;
exporter.json(sql, (function(i) {
return function(err, json) {
console.log(i)
var data = JSON.parse(json);
db.insert(data, function (err, newDoc) {});
}
})(i));
}
}
var toNeDB=函数(表,计数){
var inc=10000;
console.log(表+'=>'+计数)
对于(变量i=0;i
您可以使用递归而不是循环,这样可以确保在第一次迭代完成之前不会执行下一次迭代
var proc = function (i, count, table) {
var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC
LIMIT ' + i + ' , ' + inc'
console.log(i)
exporter.json(sql, function (err, json) {
var data = JSON.parse(json)
db.insert(data, function (err, newDoc) {
if (i < count) {
i += inc
proc(i, count, table)
}
})
})
}
var toNeDB = function (table, count) {
var inc = 10000
console.log(table + ' => ' + count)
proc(0, count, table)
}
var proc=function(i,count,table){
var sql='从'+表格+'中选择*按省ASC排序,编号说明
限制“+i+”,“+inc”
控制台日志(i)
json(sql,函数(err,json){
var data=JSON.parse(JSON)
db.insert(数据,函数(err,newDoc){
如果(i'+计数)
进程(0,计数,表)
}
让我知道如果这样做有效的话,你可以使用递归而不是循环,这样你就可以确保在第一次迭代完成之前不会执行下一次迭代
var proc = function (i, count, table) {
var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC
LIMIT ' + i + ' , ' + inc'
console.log(i)
exporter.json(sql, function (err, json) {
var data = JSON.parse(json)
db.insert(data, function (err, newDoc) {
if (i < count) {
i += inc
proc(i, count, table)
}
})
})
}
var toNeDB = function (table, count) {
var inc = 10000
console.log(table + ' => ' + count)
proc(0, count, table)
}
var proc=function(i,count,table){
var sql='从'+表格+'中选择*按省ASC排序,编号说明
限制“+i+”,“+inc”
控制台日志(i)
json(sql,函数(err,json){
var data=JSON.parse(JSON)
db.insert(数据,函数(err,newDoc){
如果(i'+计数)
进程(0,计数,表)
}
让我知道这是否有效您可能想签出。@will,但要使用map,我需要有一个分页列表来迭代,所以我不知道这是一个好的解决方案问题是什么?“我没能理解它。”费利克莫谢夫。例如,实际的代码首先打印所有的
console.log(i)
迭代,然后脚本保持安静,因此您可以使用console.log来监视进程,但它不能按我的需要工作,请将控制台日志放在回调中,但由于它是一个闭包,您应该用iffi将其包装。您可能需要签出。@will,但是要使用map,我需要有一个分页列表来迭代,所以我不知道这是一个好的解决方案问题是什么?“我没能理解它。”费利克莫谢夫。例如,实际的代码首先打印所有的console.log(i)
迭代,然后脚本保持安静,因此您可以使用console.log来监视进程,但它不能按我需要的那样工作,将控制台日志放在回调中,但由于它是一个闭包,因此您应该用iffi将其包装起来。