我试图在解析完所有事务后将它们插入到数据库中。我有一个名为load.newload(Transactionlist)的函数;它是在婴儿解析完成后传递的。
我已经测试了我的代码,如果文件列表很短,它会加载所有文件,但是一旦文件列表变长(大约10个文件或更多),它甚至在完成解析之前就调用了load.newload(transactionlist)函数。
我在想,也许我应该对baby.parse函数有另一个承诺,但它似乎不起作用。
结果如下:
解析file1,解析file2,解析file3,SQL连接,插入数据成功,解析file4,解析file5
我怎么才能解决这个问题?
这是我的密码:
var baby = require('babyparse');
var read = require('read-file');
var Promise = require('promise');
var load = require('../sql/insert');
var transactionlist = [];
var incomingfile = function(file){
//async load file and then parse after loading
var promise = new Promise(function (resolve, reject) {
read( file, 'utf8', function (err, res){
if (err)
{reject(err);
console.log('Oops, an error occured while parsing the data: %s', err);}
else {resolve(res);
console.log(file);}
});
}).then(function (results){
var promise = new Promise(function (resolve, reject) {
baby.parse(results , {
dynamicTyping: true,
delimiter: "|",
complete: function (results, error) {
if(error)
{console.log('Something went wrong');
reject(error);}
else {
for(i = 1; i < results.data.length - 1; i++)
{
var transaction = {
column1 : results.data[i][14].substring(0, 6),
column2: results.data[i][2].split(' ').join(''),
column3: results.data[i][14].split(' ').join(''),
column4: results.data[i][8],
column5: results.data[i][9]
}
transactionlist.push(transaction);
}//end for loop
resolve(results);
}
//console.log("Finished:", JSON.stringify(results.data));
}//end baby parse complete:function
});//end baby parse function
}).then(function (results){
load.newload(transactionlist);
});//end inner .then function
});//end .then function
}//end incoming file function
exports.incomingfile = incomingfile;
//newload function in insert.js
const sql = require('mssql/msnodesqlv8');
var config = require('../connect');
var newload = function (transactionlist){
sql.connect(config)
.then(() => {
console.log('connected');
const table = new sql.Table('settlement');
table.create = true;
//table.columns.add('transactionid', sql.Int, { nullable: false, primary: true});
table.columns.add('colum1', sql.VarChar(6), { nullable: false });
table.columns.add('column2', sql.VarChar(50), { nullable: false });
table.columns.add('column3', sql.VarChar(50), { nullable: false });
table.columns.add('column4', sql.VarChar(50), { nullable: false });
table.columns.add('column5', sql.VarChar(5), { nullable: false });
//add here rows to insert into the table
for (i = 0; i < transactionlist.length; i++) {
table.rows.add(transactionlist[i].column1, transactionlist[i].column2, transactionlist[i].column3, transactionlist[i].column4, transactionlist[i].column5);
console.log('transaction list', i , JSON.stringify(transactionlist.length));
}
const request = new sql.Request();
console.log('Ready to insert data');
request.bulk(table, function (error, results){
if(error)
{
console.log('Something went wrong while inserting the data into the database');
sql.close();
}
else {
console.log('Data has been inserted successfully');
sql.close();
}
})
});
};
exports.newload = newload;发布于 2017-05-21 08:20:01
问题可能在于使用全局变量transactionlist在承诺之间共享数据。考虑到存在链接承诺的情况,处理数据transactionlist的更好方法可能是将其与返回语句一起传递,并让下一个承诺毫不含糊地处理它(不管更新与否)。
这就是我要履行的承诺。
var baby = require('babyparse');
var read = require('read-file');
var Promise = require('promise');
var load = require('../sql/insert');
// var transactionlist = [];
var incomingfile = function(file){
//async load file and then parse after loading
var promise = new Promise(function (resolve, reject) {
read( file, 'utf8', function (err, res){
if (err)
{
reject(err);
console.log('Oops, an error occured while parsing the data: %s', err);
}
else {
resolve(res);
console.log(file);
}
});
}).then(function (results){
var promise = new Promise(function (resolve, reject) {
baby.parse(results , {
dynamicTyping: true,
delimiter: "|",
complete: function (results, error) {
if(error)
{
console.log('Something went wrong');
reject(error);
}
else {
// define a local var here
var transactionlist = [];
for(i = 1; i < results.data.length - 1; i++)
{
var transaction = {
column1 : results.data[i][14].substring(0, 6),
column2: results.data[i][2].split(' ').join(''),
column3: results.data[i][14].split(' ').join(''),
column4: results.data[i][8],
column5: results.data[i][9]
}
transactionlist.push(transaction);
}//end for loop
// return transactionlist instead of updating global var
resolve([results, transactionlist]);
}
//console.log("Finished:", JSON.stringify(results.data));
}//end baby parse complete:function
});//end baby parse function
}).then(function (results){
// load transactionlist again from passed values
var transactionlist = results[1];
results = results[0];
load.newload(transactionlist);
});//end inner .then function
});//end .then function
}//end incoming file function我希望您能看到我所做的更改(它们没有正确地缩进和注释)。使用此方法,在使用回调/承诺时,您将不会丢失数据。
https://stackoverflow.com/questions/44093891
复制相似问题