HiDayurie Dave
HiDayurie Dave

Reputation: 1807

NodeJs promise in loop is not get all of data result

I'm using promise.

Now I try to put the promise inside loop query, assume result2['recordset'] have 2 data.

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

When I tried to console.log(result3['recordset']); it can show me the all of both data.

[
{
    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'
  }
]

But why when I tried to console.log(result); it only show me the first data (no ID number 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'
  }
]

Upvotes: 0

Views: 82

Answers (1)

Rahul Sharma
Rahul Sharma

Reputation: 10111

forEach on won't handle promises, Change that to map and use Promise.all to get results.

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

Upvotes: 1

Related Questions