Javascript node.js中的map(),异步vs sync?;
我在Node.js中运行了一段代码,如下所示。我发现它总是转到其他条件,但是主数据的服务器不是空的Javascript node.js中的map(),异步vs sync?;,javascript,arrays,node.js,Javascript,Arrays,Node.js,我在Node.js中运行了一段代码,如下所示。我发现它总是转到其他条件,但是主数据的服务器不是空的 getOperationDetails(req, res) { let sql = 'select a.*, b.s*'; sql += ` from ${paymentSheet} a left join ${paymentHisSheet} b on a.id= b.source_id `; sql += ' where a.id=? '; func.c
getOperationDetails(req, res) {
let sql = 'select a.*, b.s*';
sql += ` from ${paymentSheet} a left join ${paymentHisSheet} b on a.id= b.source_id `;
sql += ' where a.id=? ';
func.connPool(sql, id, (err, rows, field) => {
if (err) {
res.json({ code: 400, message: err })
} else {
let masterData = [];
let details = rows.map((row, idx) => {
if (idx === 0) {
masterData.push({
id: row.id,
name: row.name
});
}
return {
operator: row.operator_info,
comments: row.cmt,
status: row.sta
}
})
if (masterData.length > 0 ) {
masterData[0].details = details;
} else {
console.log(sql);
console.log(id);
console.log('=======================');
console.log(masterData);
}
res.json({ code: 200, message: 'ok', data: masterData })
}
})
例如,控制台将显示如下所示。显然,主数据具有价值。它表示在map()之前运行“if”条件。我是否必须使用async来等待map()处理数据
allConnections:2
select a.*, b.* from payment a left join history b on a.id= b.source_id where a.id=?
83e588cd-9b4b-4592-ac7f-529bfaa9b231
=======================
allConnections:2
allConnections:2
[
{
id: '83e588cd-9b4b-4592-ac7f-529bfaa9b231',
name: 'Jeff'
}
]
我的分析:
数据库中的行应如下所示
83e588cd-9b4b-4592-ac7f-529bfaa9b231', 'Jeff', 'Operator Peter', 'OK', 0
83e588cd-9b4b-4592-ac7f-529bfaa9b231', 'Jeff', 'Operator Mary', 'NO', 1
83e588cd-9b4b-4592-ac7f-529bfaa9b231', 'Jeff', 'Operator Jet', 'OK', 2
或者像下面一样,表示没有细节
83e588cd-9b4b-4592-ac7f-529bfaa9b231', 'Jeff', null, null, null
这就是为什么我使用masterData来分离。我认为push()不应该从map()中取出,因为行可能不会返回任何内容。是否会像map()结束而push()仍在运行
==p.S.功能连接池====
let mysql = require('mysql');
let db = require('../configs/db');
let pool = mysql.createPool(db);
module.exports = {
connPool (sql, val, cb) {
pool.getConnection((err, conn) => {
if (err) {
console.log('Connection Error:' + err);
cb(err, null, null);
} else {
console.log('allConnections:' + pool._allConnections.length);
let q = conn.query(sql, val, (err, rows,fields) => {
pool.releaseConnection(conn);
if (err) {
console.log('Query:' + sql + ' error:' + err);
}
cb(err, rows, fields);
});
}
});
},
从这段代码中,您将只推送到MasterData的第一行.id和第二行.name (这在if条件中仅为第一个索引指定
idx==0
)
所以如果是这样的话,你就不需要在地图上有这个推动的东西
您可以将其从映射中移除,并让迭代器只创建details数组
你可以选择:
let details = rows.map(row => ({
operator: row.operator_info,
comments: row.cmt,
status: row.sta
})
);
let masterData = [{ id: rows[0].id, name: rows[0].name, details }]
我怀疑的是,
push
操作不知何故延迟了,因为这里没有显示一些代码(我还不确定)
我多次运行下面的代码,仍然无法重现您的问题
var行=[
{
身份证号码:“123”,
名称:“测试”,
},
{
身份证号码:“123”,
名称:“测试”,
},
{
身份证号码:“123”,
名称:“测试”,
},
]
设masterData=[];
let details=rows.map((row,idx)=>{
如果(idx==0){
masterData.push({
id:row.id,
名称:row.name
});
}
返回{
id:row.id,
名称:row.name,
}
})
如果(masterData.length>0){
控制台。登录(“登录”);
}否则{
控制台日志(主数据);
console.log('===============================');
}
你能试试这段代码是否会转到
或。里面没有异步发生。映射所以。。。不,我很想知道为什么它会转到else分支。我从数据库中获得了行结果,并尝试将主数据与deatils数据分开。map
是同步的,上面的代码中没有看到异步调用,周围的代码中一定缺少什么?rows
可能是一个空的arrayTry控制台。log(JSON.stringify(masterData))而不是记录对象本身。毫无疑问,您会发现主数据在此时是空的。对于不小心对象的记录值会随着对象的变化而变化的人来说,这是一个陷阱。这一点很好,尽管您需要先检查行的长度是否大于0。@Ian是否作为列表类型传递了行?你能提供func.connPool
的代码吗?Chindanonda,iv尝试过,控制台显示“in”…逻辑正确。不管怎样,我试着把push()从map()中拿出来试试。