Javascript node.js中的map(),异步vs sync?;

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

我在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.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()中拿出来试试。