Javascript 节点JS返回而不履行承诺
我希望这是一个简单的问题,我只是错过了一些简单的东西。我有一系列使用.then()的承诺返回函数。我的最后一个函数将返回的数据格式化为正确的格式,然后将其传递回客户端。我所遇到的问题(我想)是,在格式化函数的承诺得到解决之前,服务器将ff变量发送到客户端。让我感到困惑的是,当我记录ff变量时,它按照预期记录了所有数据 有没有想过为什么会发生这种情况,我做错了什么,最重要的是如何解决这个问题Javascript 节点JS返回而不履行承诺,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,我希望这是一个简单的问题,我只是错过了一些简单的东西。我有一系列使用.then()的承诺返回函数。我的最后一个函数将返回的数据格式化为正确的格式,然后将其传递回客户端。我所遇到的问题(我想)是,在格式化函数的承诺得到解决之前,服务器将ff变量发送到客户端。让我感到困惑的是,当我记录ff变量时,它按照预期记录了所有数据 有没有想过为什么会发生这种情况,我做错了什么,最重要的是如何解决这个问题 app.get("/subData", function(req, res) { getConne
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;
为什么要对简单的同步操作使用承诺?感谢您提供的信息,我已经删除了承诺,但它仍然表现出相同的行为。控制台正在正确记录数据,但客户端仍在接收一个空白数组数组。