Javascript for循环中的异步函数

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(

您好,我正在尝试将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(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将其包装起来。