无法返回承诺的结果

时间:2018-08-31 15:50:27

标签: javascript node.js asynchronous es6-promise

我正在尝试从2个不同的表中读取一些数据,并在呈现ejs文件之前解析CSV文件。 我可以从两个表和CSV文件中获取数据,但似乎无法返回结果。

可以肯定这是我处理异步执行方式的问题,但我看不到自己在做什么错。

最近2天,我一直在阅读有关此内容(包括此处的线程)和浏览的信息,但不知何故,答案仍然对我无济于事。

第一个文件-usercms.js

    app.get('/userscms', function(req, res)
    {
        existingUsers.getExistingUsers()
        .then(function(appUsers)
        {
            //global users array
            //I can display these in my ejs file
            globalAppUsers = appUsers;
        })
        .then(existingUsersAttributesQlik.getExistingUsersAttributesQlik())
        .then(function(usersQlikAttributes)
        {
            //global user attributes array
            //undefined data
            globalUsersQlikAttributes = usersQlikAttributes;
        })
        .then(existingSuppliers.parseSuppliersCSV())
        .then(function(supplierData)
        {
            //the result I am expecting
            //this prints undefined
            console.log(supplierData);
        }).then(function()
        {
            res.render('userscms.ejs',
            {
                users: globalAppUsers,
                attributes: globalUsersQlikAttributes
            });
        });
    });

第二个功能-getxistingUsers.js(与getExistingUsersAttributesQlik相同,但查询除外)

    var userData = [];
    var appUsers = [];

    (function (exports)
    {
        exports.getExistingUsers = function ()
        {
            return promisemysql.createConnection(dbconfig.development).then(function(conn)
            {
                var result = conn.query("SELECT id, username, firstName, lastName, email, phone, lastLogin, isAdmin, isValid, isPhoneValid, accountCreationDateTime FROM Users");
                conn.end();
                return result;
            }).then(function(rows)
            {
                return rows;
            }).then(function(rows)
            {
                if (rows.length)
                {
                    userData = [];
                    appUsers = [];

                    rows.forEach(function (elem)
                    {
                        userData.push(_.toArray(elem));
                    });

                    for (i = 0; i < userData.length; i++)
                    {
                        var appUser = new appUserModel.AppUser(
                            userData[i][0],
                            userData[i][1],
                            userData[i][2],
                            userData[i][3],
                            userData[i][4],
                            userData[i][5],
                            userData[i][6],
                            userData[i][7],
                            userData[i][8],
                            userData[i][9],
                            userData[i][10]);

                        appUsers.push(_.toArray(appUser));
                    }

                    return appUsers;
                }
                else
                {
                    console.log("NOPE");
                    return null;
                }
            }).then(function(appUsers)
            {
                console.log(appUsers);
                return appUsers;
            });
        };
    })(typeof exports === 'undefined' ? this['getExistingUsers'] = {} : exports);

第三文件-parseSuppliersCSV.js

    var supplierData = [];
    var suppliersData = [];
    var csvCount = 0;

    (function (exports)
    {
        exports.parseSuppliersCSV = function ()
        {
            return new Promise(function(resolve, reject) 
            {
                var fileStream = fs.createReadStream("myCSV.csv");
                var parser = fastCsv();

                csvCount = 0;
                supplierData = [];
                suppliersData = [];

                fileStream
                    .on("readable", function ()
                    {
                        var data;
                        while ((data = fileStream.read()) !== null) 
                        {
                            parser.write(data);
                        }
                    })
                    .on("end", function () 
                    {
                        parser.end();
                    });

                parser
                    .on("readable", function () 
                    {
                        var data;

                        while ((data = parser.read()) !== null) 
                        {
                            if(csvCount >= 1)
                            {
                                csvCount++;

                                var arrayOfStrings = data[0].split(';');
                                var supplier = new supplierModel.Supplier(arrayOfStrings[0],arrayOfStrings[1]);
                                suppliersData.push(_.toArray(supplier));                           
                            }
                            else
                            {
                                csvCount++;
                            }
                        }                   
                    })
                    .on("end", function () 
                    {
                        console.log("done");
                        //all OK here
                        console.log(suppliersData);
                        //this doesn't seem to return anything
                        return suppliersData;
                    });
            });
        };
    })(typeof exports === 'undefined' ? this['parseSuppliersCSV'] = {} : exports);

有什么主意我做错了吗?我是用错误的方式来处理这个问题吗?

1 个答案:

答案 0 :(得分:1)

我会在这里猜测,并假设您创建的诺言应该解决……而不是返回值。

               .on("end", function () 
                {
                    console.log("done");
                    //all OK here
                    console.log(suppliersData);
                    //this doesn't seem to return anything
                    return resolve(suppliersData);
                });
相关问题