Javascript 节点JS返回而不履行承诺

Javascript 节点JS返回而不履行承诺,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,我希望这是一个简单的问题,我只是错过了一些简单的东西。我有一系列使用.then()的承诺返回函数。我的最后一个函数将返回的数据格式化为正确的格式,然后将其传递回客户端。我所遇到的问题(我想)是,在格式化函数的承诺得到解决之前,服务器将ff变量发送到客户端。让我感到困惑的是,当我记录ff变量时,它按照预期记录了所有数据 有没有想过为什么会发生这种情况,我做错了什么,最重要的是如何解决这个问题 app.get("/subData", function(req, res) { getConne

我希望这是一个简单的问题,我只是错过了一些简单的东西。我有一系列使用.then()的承诺返回函数。我的最后一个函数将返回的数据格式化为正确的格式,然后将其传递回客户端。我所遇到的问题(我想)是,在格式化函数的承诺得到解决之前,服务器将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);
            }            
        });
    });
}

很明显,你的一个承诺没有兑现。为什么要在
formatData()
方法中设置
resolve()
调用条件?为什么不让循环结束呢

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);
    });
}
实际上,这里根本不需要承诺,因为这是一个同步操作。在
.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;

为什么要对简单的同步操作使用承诺?感谢您提供的信息,我已经删除了承诺,但它仍然表现出相同的行为。控制台正在正确记录数据,但客户端仍在接收一个空白数组数组。