【问题标题】:NodeJs promise in loop is not get all of data result循环中的 NodeJs 承诺不会获得所有数据结果
【发布时间】:2021-09-10 09:16:08
【问题描述】:

我正在使用promise

现在我尝试将 promise 放入循环查询中,假设 result2['recordset'] 有 2 个数据。

result2['recordset'].forEach(function(element, index){
    var query = new Promise((success, failure) => {
        request.query("SELECT M.id, M.name, M.link, M.project_idfk, M.icon FROM tbl_module M WHERE M.project_idfk = '" + element.project_idfk + "' AND M.id IN(SELECT module_idfk FROM tbl_access_module WHERE group_idfk = '" + element.group_idfk + "' AND role IS NOT NULL AND(role = 'CREATE' OR role = 'VIEW'))", function (err, result3){
            success(result3['recordset']);
            console.log(result3['recordset']);
        });
    });
});

query.then(function(result) {
    console.log(result);
    res.json({ module: result });
})

当我尝试console.log(result3['recordset']); 时,它可以向我显示这两个数据。

[
{
    id: 6,
    name: 'Department',
    link: 'department',
    project_idfk: 2,
    icon: 'glyphicon-tasks'
  }
]
[
  {
    id: 1,
    name: 'Location',
    link: 'location',
    project_idfk: 1,
    icon: 'glyphicon-screenshot'
  },
  {
    id: 2,
    name: 'Device',
    link: 'device',
    project_idfk: 1,
    icon: 'glyphicon-hdd'
  },
  {
    id: 3,
    name: 'Floor Map',
    link: 'map',
    project_idfk: 1,
    icon: 'glyphicon-map-marker'
  },
  {
    id: 4,
    name: 'Notification',
    link: 'notificaction',
    project_idfk: 1,
    icon: 'glyphicon-globe'
  },
  {
    id: 5,
    name: 'Report',
    link: 'report',
    project_idfk: 1,
    icon: 'glyphicon-tasks'
  }
]

但是为什么当我尝试console.log(result); 时它只显示第一个数据(没有 ID 号 6)

[
{
    id: 1,
    name: 'Location',
    link: 'location',
    project_idfk: 1,
    icon: 'glyphicon-screenshot'
  },
  {
    id: 2,
    name: 'Device',
    link: 'device',
    project_idfk: 1,
    icon: 'glyphicon-hdd'
  },
  {
    id: 3,
    name: 'Floor Map',
    link: 'map',
    project_idfk: 1,
    icon: 'glyphicon-map-marker'
  },
  {
    id: 4,
    name: 'Notification',
    link: 'notificaction',
    project_idfk: 1,
    icon: 'glyphicon-globe'
  },
  {
    id: 5,
    name: 'Report',
    link: 'report',
    project_idfk: 1,
    icon: 'glyphicon-tasks'
  }
]

【问题讨论】:

  • .forEach() 不支持承诺,因此将查询包装在.forEach() 循环内的承诺中绝对没有好处。
  • 嗨@jfriend00 有什么办法可以解决这个问题吗?
  • 您似乎没有对查询结果做任何事情,因此为了知道要推荐什么,我们需要查看您尝试使用它们做什么并查看该代码。此外,我们需要知道循环是否需要排序,或者每次迭代是否可以并行运行。
  • 而且,了解您正在使用 NPM 中的哪个数据库模块会有所帮助,因为现在大多数人都可以选择内置的 Promise 支持。

标签: node.js arrays json sql-server promise


【解决方案1】:

forEach on 不会处理 Promise,将其更改为映射并使用 Promise.all 获取结果。

const promises = result2["recordset"].map(function (element, index) {
  return new Promise((success, failure) => {
    request.query(
      "SELECT M.id, M.name, M.link, M.project_idfk, M.icon FROM tbl_module M WHERE M.project_idfk = '" +
        element.project_idfk +
        "' AND M.id IN(SELECT module_idfk FROM tbl_access_module WHERE group_idfk = '" +
        element.group_idfk +
        "' AND role IS NOT NULL AND(role = 'CREATE' OR role = 'VIEW'))",
      (err, result) => {
        success(result["recordset"]);
        console.log(result["recordset"]);
      }
    );
  });
});

Promise.all(promises).then(function (result) {
  console.log(result); // list or all result
  // Do something and send response
  res.json({ module: result });
});

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2021-08-12
    • 2017-06-22
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多