-2

I'm writing a JavaScript function for handling API calls inside map method, before done all tasks inside map method my function is to execute the wrong result. But it's not working for my expectation.

my code:

function vehicleAndWorker(hook){
  var routeArray = [];
  return new Promise(function(resolve, reject) {
    hook.data.map(d => {
      var routeArray = [];
      delete d.driverId
      delete d.vehicle
      delete d.workers
      return hook.app.service('vehicles')
        .find({ query: {vehicleId: d.vehicleId}})
        .then(result=>{
          var vehicleTypeId = result.data[0].vehicleTypeId;
          return hook.app.service('vehicle-types')
              .find({ query: {vehicleTypeId: vehicleTypeId }})
              .then(result=>{
                  d.vehicle = {
                    vehicleId: d.vehicleId,
                    vehicleTypeId: vehicleTypeId,
                    fixedCost: result.data[0].fixedCost,
                    variableCost: result.data[0].variableCost
                  }
                  return hook.app.service('workers')
                    .find({ query: {assignedVehicleId: d.vehicleId}})
                    .then(result=>{
                        d.workers = [{
                          id:result.data[0].workerId,
                          name:result.data[0].name,
                          type:result.data[0].type
                        }];
                        delete d.vehicleId;
                  })
              })
          })
      })
      resolve(hook)
  })
}

before executing my map job, the return is executed how to resolve this.

S. Hesam
  • 5,266
  • 3
  • 37
  • 59
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133

3 Answers3

2

Try to use Promise.all()

Your ".map" call returns a set of Promises. So it returns immidiatly,

function vehicleAndWorker(hook){
    var routeArray = [];
    return new Promise(function(resolve, reject) => 
       Promise.all(hook.data.map(d => {....})
          .then(() => resolve(hook))
    );
 }

As @Akshay mentioned we can even reduce this function code, and move you "map" function in some other, so your vahicle will be single line:

var vehicleAndWorker = (hook) => Promise.all(hook.data.map(d => your_map_function)
              .then(() => hook);
2oppin
  • 1,941
  • 20
  • 33
2

first chain your promises and not nest them .if you use nesting then you dont need promise.

second use promise all

function vehicleAndWorker(hook){
    var all = [];
    var i =0;
    hook.data.map(d => {
      delete d.driverId
      delete d.vehicle
      delete d.workers
      all[i] = hook.app.service('vehicles')
        .find({ query: {vehicleId: d.vehicleId}})
        .then(result=>{
              var vehicleTypeId = result.data[0].vehicleTypeId;
              return hook.app.service('vehicle-types').find({ query: {vehicleTypeId: vehicleTypeId }})
         })
        .then(result=>{
            d.vehicle = {
              vehicleId: d.vehicleId,
              vehicleTypeId: vehicleTypeId,
              fixedCost: result.data[0].fixedCost,
              variableCost: result.data[0].variableCost
            }
            return hook.app.service('workers').find({ query: {assignedVehicleId: d.vehicleId}})
         })
        .then(result=>{
            d.workers = [{
              id:result.data[0].workerId,
              name:result.data[0].name,
              type:result.data[0].type
            }];
            delete d.vehicleId;
            return result
         })
          i++;
      })
     return Promise.all(all).then(hook);     
}
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133
Amit Wagner
  • 3,134
  • 3
  • 19
  • 35
0

try this

function vehicleAndWorker(hook){
  var routeArray = [];
  return new Promise(function(resolve, reject) {
    hook.data.map(d => {
      var routeArray = [];
      delete d.driverId
      delete d.vehicle
      delete d.workers
      hook.app.service('vehicles')
        .find({ query: {vehicleId: d.vehicleId}})
        .then(result=>{
          var vehicleTypeId = result.data[0].vehicleTypeId;
          hook.app.service('vehicle-types')
              .find({ query: {vehicleTypeId: vehicleTypeId }})
              .then(result=>{
                  d.vehicle = {
                    vehicleId: d.vehicleId,
                    vehicleTypeId: vehicleTypeId,
                    fixedCost: result.data[0].fixedCost,
                    variableCost: result.data[0].variableCost
                  }
                  hook.app.service('workers')
                    .find({ query: {assignedVehicleId: d.vehicleId}})
                    .then(result=>{
                        d.workers = [{
                          id:result.data[0].workerId,
                          name:result.data[0].name,
                          type:result.data[0].type
                        }];
                        delete d.vehicleId;
                  })
              })
          })
      resolve(hook)
      })
  })
}
Akshay Vijay Jain
  • 13,461
  • 8
  • 60
  • 73