为了账号安全,请及时绑定邮箱和手机立即绑定

Node JS 在没有履行承诺的情况下返回

Node JS 在没有履行承诺的情况下返回

守着星空守着你 2022-06-05 16:26:25
我希望这是一个简单的问题,而我只是错过了一些简单的问题。我有一系列使用 .then() 的 promise 返回函数。我的最终函数获取我返回的数据,并将其格式化为正确的格式,然后将其传递回客户端。我遇到的问题(我认为)是服务器在格式化函数的承诺得到解决之前将 ff 变量发送到客户端。让我感到困惑的是,当我记录 ff 变量时,它会按预期记录所有数据。关于为什么会发生这种情况,我做错了什么以及最重要的是如何解决这个问题的任何想法?app.get("/subData", function(req, res) {    getConnection().then(function() {        return getSQL();    }).then(function(sql) {        return executeQuery(sql);    }).then(function(data) {        return formatData(data);    }).then(function(ff) {        console.log(ff);        res.status(200).send(ff);    }).catch(function(err) {        console.log("ERR:");        console.log(err);        res.status(405).send(err);    });    });这是最终的格式数据函数:function formatData(data) {    var finArr = Array();    return new Promise(function(resolve, reject) {        data.rows.forEach(function(row, fin) {            var tempArr = Array();            row.forEach(function(itm, pos) {                var ttl = data.metaData[pos].name;                var val = itm;                tempArr[ttl] = val;            });            finArr.push(tempArr);            if(fin + 1 == data.rows.length) {                resolve(finArr);            }                    });    });}
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

很明显,您的一个承诺没有解决。为什么要resolve()在您的formatData()方法中进行有条件的调用?为什么不让循环用完?


function formatData(data) {

    var finArr = Array();


    return new Promise(function(resolve, reject) {

        data.rows.forEach(function(row, fin) {

            var tempArr = Array();


            row.forEach(function(itm, pos) {

                var ttl = data.metaData[pos].name;

                var val = itm;


                tempArr[ttl] = val;

            });


            finArr.push(tempArr);    

        });

        resolve (finArr);

    });

}

事实上,这里根本不需要 Promise,因为它是一个同步操作。而且,可以在.next()链中使用同步操作。像这样。


function formatData(data) {

    var finArr = Array();


    data.rows.forEach(function(row, fin) {

        var tempArr = Array();

        row.forEach(function(itm, pos) {

            var ttl = data.metaData[pos].name;

            var val = itm;

            tempArr[ttl] = val;

        });

        finArr.push(tempArr);    

    });

    return finArr;

}


查看完整回答
反对 回复 2022-06-05
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

该问题与正确解决的承诺无关。问题在于我如何格式化我的数据以发送回客户端。我正在使用以下代码构建一个关联数组的数组。当它被发送到客户端时,它被作为一个空白数组发送。


data.rows.forEach(function(row, fin) {

        var tempArr = Array();

        row.forEach(function(itm, pos) {

            var ttl = data.metaData[pos].name;

            var val = itm;

            tempArr[ttl] = val;

        });

        finArr.push(tempArr);    

    });

    return finArr;

我需要做的是将数据作为对象数组发送,然后在客户端将其转换为数组数组。通过将我的代码调整为此,数据可以根据需要正确传递。


data.rows.forEach(function(row, fin) {

    // Change From var tempArr = Array() to var tempArr = {} to initialize new Object

    var tempArr = {};


    row.forEach(function(itm, pos) {

        var ttl = data.metaData[pos].name;

        var val = itm;


        tempArr[ttl] = val;

    });

    finArr.push(tempArr);    

});

return finArr;


查看完整回答
反对 回复 2022-06-05
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号