简体   繁体   中英

Nestjs Framework: Run parallel task using Async

I'm struggling right now with "async".

I'm starting with NestJs Framework and i need run a bunch of task on parallel.

Before, using Nodejs + Express only, i have been useing something like this

...
...
.get('/some/path', function(){
 async.parallel({
   todayBalance: async.apply(function (cb) {
      return SomeFunction(params, cb);
   }),
   currentWeek: async.apply(function (cb) {
      return SomeFunction2(params, cb);
   }),
   ...
   ... 
   // more tasks
   }, 
   function (err, results) {
          # some code for logic
          # here i get my result and gather data and RETURN
  });
});
  

Nowadays, using NestJs framework, i have got something like this

myservice.ts

This is a service created for doing this.


 // Service Definitions
 

 async someFunction(userBusinessId: string): Promise<any> {

 // i tried to use same strategy from Async
 // but nothing accuring
 async.parallel({
   todayBalance: async.apply(function (cb) {
      return SomeFunction(params, cb);
   }),
   currentWeek: async.apply(function (cb) {
      return SomeFunction2(params, cb);
   }),
   ...
   ... 
   // more tasks
   }, 
   function (err, results) {
          # some code for logic
          # here i get my result and gather data and RETURN
          
          # DOESNT RETURN, NEVER EVER GETS HERE
  });


 }

Any idea what's wrong?

Thanks for your support!

First off I made two basics mistake

1. I Forgot use cb Function

using Nodejs + Express we just made something like this

In this case I use mysql

const SomeFunction= (userBusinessId, cb) => {  
    cnx.connection.query(`some pretty query`, 
          cb  // <===== use Callback here
    );
};

now using Nestjs i tried(badly results) to made something like this. Ignoring cb

const SomeFunction= (userBusinessId, cb) => {  
      const data = await getManager().query(`some pretty query`);      
      return data; // <===== WRONG  INSTEAD USE cb Function, using like this parallel function will never triggered
};

Instead return single data, we must trigger the cb function overloading with result

Documentation

const SomeFunction= (userBusinessId, cb) => {  
       ...
      cb(null, data); // EXECUTE LIKE THIS, this will resume the pipe. null param suppose no error
};

2. Try to return the function service value inside the Async callback

Even if you try to do something like

async list():Promise<any>{
    async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
            return data;
      });
}

OR

async list():Promise<any>{
  const data =  await async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
            return data;
      });   

   return data;
}

this funtion with always return undefined . even if you remove the Funtion Type Promise<any>

For avoid this you must return a Promise like

async list():Promise<any>{
  return new Promise( (resolver, reject) => {
    
    async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
           if(err)
              reject(err);
           ...
           resolver(results);
      });
   
   } )
}

Hope this help you too!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM