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