【问题标题】:Unable to return result from promise无法从承诺返回结果
【发布时间】:2019-02-06 16:40:06
【问题描述】:

我正在尝试从 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);

任何想法我做错了什么?我是不是走错了路?

【问题讨论】:

  • 你可能想要resolve 而不是return: resolve(suppliersData);
  • .then(existingUsersAttributesQlik.getExistingUsersAttributesQlik()) 不起作用。您必须将函数传递给then,而不是promise。
  • 避免使用 globalAppUsersglobalUsersQlikAttributes 的东西。有关更好的方法,请参阅 How do I access previous promise results in a .then() chain?
  • @Bergi - 谢谢,这有帮助。关于全局变量,我不打算这样放着。
  • @Mark - 谢谢。更改为解析并返回函数(基于伯格的建议)。

标签: javascript node.js asynchronous es6-promise


【解决方案1】:

我会在这里猜测一下,并假设您创建的承诺应该解析为……而不是返回一个值。

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

【讨论】:

  • 谢谢。更改为解析并返回函数(基于伯格的建议)。
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2016-04-30
  • 2020-03-06
相关资源
最近更新 更多