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

我希望这是一个简单的问题,而我只是错过了一些简单的问题。我有一系列使用 .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);

            }            

        });

    });

}


守着星空守着你
浏览 110回答 2
2回答

忽然笑

很明显,您的一个承诺没有解决。为什么要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;}

摇曳的蔷薇

该问题与正确解决的承诺无关。问题在于我如何格式化我的数据以发送回客户端。我正在使用以下代码构建一个关联数组的数组。当它被发送到客户端时,它被作为一个空白数组发送。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;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript