javascript - Node.js 中的 map(),异步与同步?

标签 javascript arrays node.js

我在 Node.js 中运行了如下所示的段代码。我发现它总是会转到 else 条件,但是 masterData 不为空。

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 })
      }
   })

例如,控制台将显示如下。显然masterData是有值(value)的。这意味着“if”条件在map()之前运行。我是否必须使用 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()还在运行一样?

==== func.connPool====

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);
        });
      }
    });
  },

最佳答案

我怀疑 push 操作由于此处未显示的某些代码而出现某种延迟(我还不确定)。

我多次运行以下代码,但仍然无法重现您的问题。

var rows = [
    {
        id: "123",
        name: "test",
    },
    {
        id: "123",
        name: "test",
    },
    {
        id: "123",
        name: "test",
    },
]

let masterData = [];
let details = rows.map((row, idx) => {
    if (idx === 0) {
      masterData.push({
        id: row.id,
        name: row.name
      });
    }
    return {
      id: row.id,
      name: row.name,
    }
})
if (masterData.length > 0 ) {
    console.log("in");
} else {
    console.log(masterData);
    console.log('=======================');
}

您能否尝试一下此代码是否转到else

关于javascript - Node.js 中的 map(),异步与同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59098120/

相关文章:

node.js - 为什么我不用 npm 来安装 yarn?

node.js - 安全访问渲染器进程中基于 Node 的模块

javascript - Highcharts - 对 Angular 线 X/Y 轴

javascript - node.js Google Sheets API 不允许发布新值

javascript - 如何获取异步函数的值并保存它

c++ - 为什么字符数组与指针和数组的处理方式不同?

java - 在 Java 中将 StringBuffer 转换为字节数组

javascript - 在数组json中的单个对象中转换多个相同的键对象

javascript - 单击按钮后 jQuery 函数不起作用?

javascript - Fabric js 使用自定义属性扩展到对象,丢失默认属性