首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >承诺在传递到下一个函数之前不会等待

承诺在传递到下一个函数之前不会等待
EN

Stack Overflow用户
提问于 2017-05-21 06:36:09
回答 1查看 931关注 0票数 0

我试图在解析完所有事务后将它们插入到数据库中。我有一个名为load.newload(Transactionlist)的函数;它是在婴儿解析完成后传递的。

我已经测试了我的代码,如果文件列表很短,它会加载所有文件,但是一旦文件列表变长(大约10个文件或更多),它甚至在完成解析之前就调用了load.newload(transactionlist)函数。

我在想,也许我应该对baby.parse函数有另一个承诺,但它似乎不起作用。

结果如下:

解析file1,解析file2,解析file3,SQL连接,插入数据成功,解析file4,解析file5

我怎么才能解决这个问题?

这是我的密码:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-21 08:20:01

问题可能在于使用全局变量transactionlist在承诺之间共享数据。考虑到存在链接承诺的情况,处理数据transactionlist的更好方法可能是将其与返回语句一起传递,并让下一个承诺毫不含糊地处理它(不管更新与否)。

这就是我要履行的承诺。

代码语言:javascript
复制
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

我希望您能看到我所做的更改(它们没有正确地缩进和注释)。使用此方法,在使用回调/承诺时,您将不会丢失数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44093891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档