0

I have array of objects and I have to perform asynchronous operation on each element of array.But when I use Async.series() function,it is having some conflict in async call in between functions.Please suggest some operation through async.map() function.

function(cb){
    var bookings = payload.bookings;
    for(var i=0;i<bookings.length;i++){
        var dataToSave = {};
        //service choosen by customer
        var service_id = bookings[i].serviceId;
        dataToSave.serviceId = service_id;

        var query = {
            services : {$elemMatch : { serviceId : service_id } }
        };

        var projection = {
            cellPhoneNumber :1,
            countryCode:1,
            services :1
        };
        var options = {};

        Service.serviceProvider.getServiceProviders(query,projection,options,function(err,data){
            if(err) {
                cb(err);
            } else {
                if(data && data.length>0){
                    //getting list of SP which gives the service name given by customer
                    dataToSave.serviceProviderList = [];
                    for(var sp=0;sp<data.length;sp++){
                        var serviceProvider = {};
                        serviceProvider.id = data[sp]._id;
                        //searching in services array of one particular service id
                        for(var j=0;j<data[sp].services.length;j++){
                            if(data[sp].services[j].serviceId==service_id) {
                                serviceProvider.serviceRate = data[sp].services[j].rate;
                                break;
                            }
                        }
                        dataToSave.serviceProviderList.push(serviceProvider);
                    }
                 } else {
                     cb(ERROR.NO_SERVICE_PROVIDERS_FOUND);
                 }
                 console.log("dataToSave 1",dataToSave);
             }
         });
     }
 },
 function(cb) {
     cb();
 } 

Output:

dataToSave 2 { serviceId: '578e0da7c8c4cfc807040852' }
dataToSave 1 { serviceId: '578e0da7c8c4cfc807040852',
  serviceProviderList: 
   [ { id: 578e18f6ed564791083c75ad, serviceRate: 200 },
     { id: 578e1996ed564791083c75b4, serviceRate: 200 } ] }

Expected Output :

dataToSave 1 { serviceId: '578e0da7c8c4cfc807040852',
  serviceProviderList: 
   [ { id: 578e18f6ed564791083c75ad, serviceRate: 200 },
     { id: 578e1996ed564791083c75b4, serviceRate: 200 } ] } 

dataToSave 1 { serviceId: '578e0da7c8c4cfc807040852',
  serviceProviderList: 
   [ { id: 578e18f6ed564791083c75ad, serviceRate: 200 },
     { id: 578e1996ed564791083c75b4, serviceRate: 200 } ] }

Please suggest some operation using async.map()..so that I can perform each operation separately.

Udit Kumawat
  • 654
  • 1
  • 8
  • 21
  • This is the classic closures-in-loops error. By the time your callback to `getServiceProviders` returns, `service_id` has already been overwritten but subsequent iterations of your `for` loop. See the linked question's answers for how to solve it. – T.J. Crowder Jul 19 '16 at 13:56
  • @T.J.Crowder can we solve it using async.map() function ? – Udit Kumawat Jul 19 '16 at 18:57

0 Answers0