javascript - for 循环内的 async 函数

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

问题是 for 循环没有按我的意愿工作。我需要使用它来更改 sql 分页,因为 sqlite 数据库非常庞大,我无法在单个查询上传递所有数据。

使用 async.map 更新

const sqliteJSON = require('sqlite-json');
const Datastore = require('nedb')
var range = require("range");
var async = require("async");

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, cb) { 
    var inc = 10000;
    var pagination = range.range(1,count+inc,inc)

    async.map(pagination, function (page, cb){
        var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ page + ' , ' + inc;
        console.log(page, table, inc);
        exporter.json(sql, function(err, json) {
            var data = JSON.parse(json);
            console.log(data[0])
            db.insert(data, function (err, newDoc) {});
        });
    }.bind({ table: table, inc: inc }), function(err,results){

    })

}

和输出:

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

关于javascript - for 循环内的 async 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45945044/

相关文章:

javascript - 渲染阻塞 react.js 和 pageSpeed/page rank

javascript - 有没有办法覆盖 unicode 字符?

javascript - 获取 URL,通过 Javascript 而不是 jQuery 获取标题

node.js - MongoDB 架构 : default coordinates for GPS position

node.js - Node ejs forEach 导致 'Content Security Policy' 错误

android - 在 Node 中发送 GCM 推送

JavaScript 逻辑问题

javascript - 页面加载时触发 jQuery 事件

javascript - 错误: Expected undefined to be a GraphQL schema on hello world

javascript - redis 中唯一、安全的短代码(使用 Node )