Search code examples
javascriptnode.jsmongodbpromisefeathersjs

Promise not working properly when I use inside map using javascript


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.


Solution

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